<?xml version="1.0" encoding="UTF-8"?>
 <rdf:RDF xmlns="http://purl.org/rss/1.0/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://web.resource.org/cc/" xmlns:syn="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/">
  <channel rdf:about="http://pinboard.in">
    <title>Pinboard (anu)</title>
    <link>https://pinboard.in/u:anu/public/</link>
    <description>recent bookmarks from anu (from google)</description>
    <items>
      <rdf:Seq>	<rdf:li rdf:resource="http://www.wptavern.com/?p=5751"/>
	<rdf:li rdf:resource="http://wordpress.tv/?p=7191"/>
	<rdf:li rdf:resource="http://blogs.lessthandot.com/index.php/WebDev/UIDevelopment/automated-web-testing-with-selenium"/>
	<rdf:li rdf:resource="http://wordpress.tv/?p=7039"/>
	<rdf:li rdf:resource="http://worrydream.com/Tangle/"/>
	<rdf:li rdf:resource="http://www.pbs.org/idealab/2011/10/no-internet-no-problem-use-sms-radio-software-and-creativity290.html"/>
	<rdf:li rdf:resource="http://coding.smashingmagazine.com/2011/10/12/prefixfree-break-free-from-css-prefix-hell/"/>
	<rdf:li rdf:resource="http://www.woothemes.com/2011/10/woothemes-at-wordcamp-cape-town/"/>
	<rdf:li rdf:resource="http://www.smashingmagazine.com/2011/09/30/wordpress-essentials-how-to-create-a-wordpress-plugin/"/>
	<rdf:li rdf:resource="https://docs.google.com/present/view?id=dkx3qtm_22dxsrgcf4&amp;pli=1"/>
	<rdf:li rdf:resource="http://objology.blogspot.com/2011/09/one-of-best-bits-of-programming-advice.html?spref=tw"/>
	<rdf:li rdf:resource="http://www.wired.com/autopia/2011/09/787-flight-training/"/>
	<rdf:li rdf:resource="http://www.smashingmagazine.com/2011/09/22/wordpress-essentials-interacting-with-the-wordpress-database/"/>
	<rdf:li rdf:resource="http://publisherblog.automattic.com/?p=1712"/>
	<rdf:li rdf:resource="http://weblogtoolscollection.com/?p=10498"/>
	<rdf:li rdf:resource="http://alexking.org/?p=7260"/>
	<rdf:li rdf:resource="http://wpdevel.wordpress.com/2011/09/18/write-a-tutorial-for-setting-up-a-local-dev-environment/"/>
	<rdf:li rdf:resource="http://itechtalks.blogspot.com/2011/09/quality-ruby-on-rails-resources-and.html"/>
	<rdf:li rdf:resource="http://www.roughtype.com/archives/2011/09/raise_high_the_1.php"/>
	<rdf:li rdf:resource="http://www.wptavern.com/?p=5419"/>
	<rdf:li rdf:resource="http://www.poynter.org/how-tos/career-development/ask-the-recruiter/144925/live-chat-today-kim-bui-on-how-to-stand-out-as-a-communitysocial-media-editor/"/>
	<rdf:li rdf:resource="http://www.poynter.org/latest-news/media-lab/mobile-media/145623/how-the-boston-globe-built-an-all-in-one-website-web-app-and-mobile-site/"/>
	<rdf:li rdf:resource="http://www.poynter.org/latest-news/top-stories/145687/subscription-only-bostonglobe-com-launches-with-boston-com-free/"/>
	<rdf:li rdf:resource="http://michael.peopleofhonoronly.com/vim/"/>
	<rdf:li rdf:resource="http://wordpress.tv/?p=7214"/>
	<rdf:li rdf:resource="http://wordpress.tv/?p=7218"/>
	<rdf:li rdf:resource="http://wordpress.tv/?p=7326"/>
	<rdf:li rdf:resource="http://wordpress.tv/?p=7157"/>
	<rdf:li rdf:resource="http://www.smashingmagazine.com/2011/09/05/getting-started-with-the-paypal-api/"/>
	<rdf:li rdf:resource="http://www.dreamincode.net/forums/topic/54760-professional-level-login-design-pt-1/"/>
	<rdf:li rdf:resource="http://www.tuaw.com/2011/08/31/how-the-ipad-is-changing-baseball/"/>
	<rdf:li rdf:resource="http://www.antipope.org/charlie/blog-static/2011/08/because-i-have-too-much-spare-.html"/>
	<rdf:li rdf:resource="http://uxmag.com/articles/introduction-to-design-studio-methodology"/>
	<rdf:li rdf:resource="http://highscalability.com/blog/2011/8/22/strategy-run-a-scalable-available-and-cheap-static-site-on-s.html"/>
	<rdf:li rdf:resource="http://www.schneier.com/blog/archives/2011/08/cheating_at_cas.html"/>
	<rdf:li rdf:resource="http://tobolds.blogspot.com/2011/08/crowd-control.html"/>
	<rdf:li rdf:resource="http://www.disambiguity.com/uxdo-workshop-facilitation/"/>
	<rdf:li rdf:resource="http://www.tuaw.com/2011/08/20/energizer-travel-charger-powers-your-mac-iphone-and-ipad-a/"/>
	<rdf:li rdf:resource="http://freelanceswitch.com/switchtips/freelancer-reputation-apps/"/>
	<rdf:li rdf:resource="http://www.tuaw.com/2011/08/11/daily-iphone-app-baby-monkey-going-backwards-on-a-pig/"/>
	<rdf:li rdf:resource="http://tobolds.blogspot.com/2011/08/raid-documentary.html"/>
	<rdf:li rdf:resource="http://www.lindapeng.com/2011/08/05/10-lessons-i-learned-from-designing-an-online-community-using-wordpress-and-buddypress/"/>
	<rdf:li rdf:resource="http://infovore.org/archives/2011/08/06/links-for-august-6th-4/"/>
	<rdf:li rdf:resource="http://www.marco.org/2011/08/04/puerto-rico-hd-ipad-board-game-review"/>
	<rdf:li rdf:resource="http://www.litkicks.com/AMemoirInProgress"/>
	<rdf:li rdf:resource="http://www.tuaw.com/2011/08/02/iomega-mac-companion-hard-drive-big-storage-high-powered-charg/"/>
	<rdf:li rdf:resource="https://github.com/alfie/MySQL--Replication"/>
	<rdf:li rdf:resource="http://blog.programmableweb.com/2011/08/01/need-an-out-use-the-fake-call-api/"/>
	<rdf:li rdf:resource="http://blog.edouardswiac.net/2011/07/31/hacking-like-a-hacker-on-a-mac.html"/>
	<rdf:li rdf:resource="http://www.oreillynet.com/ruby/blog/2006/03/interviewing_ruby_programmers.html"/>
	<rdf:li rdf:resource="http://www.pbs.org/idealab/2011/07/the-frightening-real-world-strength-of-channel-4s-sweatshop-game207.html"/>
	<rdf:li rdf:resource="http://daringfireball.net/2011/07/succeeding_steve_jobs"/>
	<rdf:li rdf:resource="http://tobolds.blogspot.com/2011/07/forum-lies.html"/>
	<rdf:li rdf:resource="http://www.roughtype.com/archives/2011/07/news_in_the_net.php"/>
	<rdf:li rdf:resource="http://theme.it/an-alternative-to-the-shortcode-madness-part-1/"/>
	<rdf:li rdf:resource="http://www.marco.org/2011/07/19/siracusa-multipage"/>
	<rdf:li rdf:resource="http://freelanceswitch.com/product-reviews/open-source-project-management-tools/"/>
	<rdf:li rdf:resource="http://www.smashingmagazine.com/2011/07/19/create-an-html-and-css-mobile-web-app-using-sencha-touch-2/"/>
	<rdf:li rdf:resource="http://uxmag.com/articles/change-on-a-dime-agile-design"/>
	<rdf:li rdf:resource="http://lists.mysql.com/replication/2114"/>
	<rdf:li rdf:resource="http://laughingsquid.com/dean-martin-burgers/"/>
	<rdf:li rdf:resource="http://www.youtube.com/watch?v=_V4q-zb2iI4"/>
	<rdf:li rdf:resource="http://oreilly.com/catalog/9781449397296"/>
	<rdf:li rdf:resource="http://www.smashingmagazine.com/2011/07/05/free-wordpress-themes-2011-edition/"/>
	<rdf:li rdf:resource="http://radar.oreilly.com/2011/06/google-docs-wordpress-indesign-workflow.html"/>
	<rdf:li rdf:resource="http://www.stickycomics.com/how-we-treat-our-computers/"/>
	<rdf:li rdf:resource="http://www.smashingmagazine.com/2011/06/28/setup-a-ubuntu-vps-for-hosting-ruby-on-rails-applications-2/"/>
	<rdf:li rdf:resource="http://www.digital-photography-school.com/6-winning-ways-to-work-wide"/>
	<rdf:li rdf:resource="http://radar.oreilly.com/2011/06/9-digital-book-tools.html"/>
	<rdf:li rdf:resource="http://www.smashingmagazine.com/2011/06/22/following-a-web-design-process/"/>
      </rdf:Seq>
    </items>
  </channel><item rdf:about="http://www.wptavern.com/?p=5751">
    <title>WPTavern: Awesome Tutorial On User Taxonomies</title>
    <dc:date>2011-10-31T13:00:20+00:00</dc:date>
    <link>http://www.wptavern.com/?p=5751</link>
    <dc:creator>anu</dc:creator><description><![CDATA[In typical Just Tadlock fashion, he has written and published another in-depth tutorial that covers User Taxonomies. The tutorial is not for the faint of heart as it requires that you know how a few sections of WordPress work such as plugins, themes, users, and the taxonomies themselves. Just imagine how awesome the Codex would be if Justin wrote the entire thing! 



Related posts:Help Justin Tadlock Develop A User Management Plugin
Justin Tadlock On Creating Custom bbPress Views
A Theme I Can Be Critical About

]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:9e59a0a1a7f9/</dc:identifier>
</item>
<item rdf:about="http://wordpress.tv/?p=7191">
    <title>WordPress.tv: Catherine Roy &amp;Anne Pelletier: Pour un WordPress</title>
    <dc:date>2011-10-29T03:02:03+00:00</dc:date>
    <link>http://wordpress.tv/?p=7191</link>
    <dc:creator>anu</dc:creator><description><![CDATA[


         ]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:4aae8f252b62/</dc:identifier>
</item>
<item rdf:about="http://blogs.lessthandot.com/index.php/WebDev/UIDevelopment/automated-web-testing-with-selenium">
    <title>Automated Web Testing with Selenium IDE</title>
    <dc:date>2011-10-26T15:19:06+00:00</dc:date>
    <link>http://blogs.lessthandot.com/index.php/WebDev/UIDevelopment/automated-web-testing-with-selenium</link>
    <dc:creator>anu</dc:creator><description><![CDATA[Comments]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:f22fef9bc991/</dc:identifier>
</item>
<item rdf:about="http://wordpress.tv/?p=7039">
    <title>WordPress.tv: David Cook: Setting up Local Test Environments</title>
    <dc:date>2011-10-23T03:15:17+00:00</dc:date>
    <link>http://wordpress.tv/?p=7039</link>
    <dc:creator>anu</dc:creator><description><![CDATA[

         ]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:ffaafc000e36/</dc:identifier>
</item>
<item rdf:about="http://worrydream.com/Tangle/">
    <title>Tangle is a JavaScript library for creating reactive documents.</title>
    <dc:date>2011-10-21T20:15:07+00:00</dc:date>
    <link>http://worrydream.com/Tangle/</link>
    <dc:creator>anu</dc:creator><description><![CDATA[Comments]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:31b750bdebd3/</dc:identifier>
</item>
<item rdf:about="http://www.pbs.org/idealab/2011/10/no-internet-no-problem-use-sms-radio-software-and-creativity290.html">
    <title>No Internet? No Problem. Use SMS, Radio, Software, and Creativity</title>
    <dc:date>2011-10-21T12:20:21+00:00</dc:date>
    <link>http://www.pbs.org/idealab/2011/10/no-internet-no-problem-use-sms-radio-software-and-creativity290.html</link>
    <dc:creator>anu</dc:creator><description><![CDATA[In Uganda, where many lack access to the Internet, people can engage with local radio stations to make informed choices and hold their leaders accountable. Using SMS and a new tool, TRAC FM, listeners can respond to poll questions such as: What service delivery should be a priority: health care, education, security, sanitation or transport? 


TRAC FM was the focus of a larger case study we did for the Mobile Media Toolkit. The Mobile Media Toolkit is a project of MobileActive.org. The Toolkit provides how-to guides, wireless tools, and case studies on how mobile phones can (and are) being used for reporting, news broadcasting, and citizen media. 


The TRAC FM software plots SMS responses to questions poised during radio programs. The responses are condensed in data visualizations, including bar graphs, time graphs, and maps, so that radio presenters can get an overview of where reports are coming from and what the issues are. 





But, in Uganda, radio stations generally do not have websites, so sharing the visualizations with their audience requires a little more creativity. What stations do often have is an Internet connection to download audio files they use for advertisements from companies like MTN.  


How data visualizations help

So radio presenters log into the TRAC FM system through their Internet connection in the studio and share the poll results with listeners during their talk show. The data visualization overviews may offer more substance, as they are the aggregation of an entire audience and not just an individual opinion. The data visualization for the public service delivery question, for example, showed that 65 percent of respondents thought health care was the top priority. 


To learn more about how they did this, read the full case study at the Mobile Media Toolkit. 


The Mobile Media Toolkit is a collection of resources, guides, case studies, and mobile tool reviews to help you make sense of mobile media. From creating and editing audio and video content on your handset, to delivering content to mobile audiences, to engaging with listeners and readers via mobile, it's a one-stop shop on Making Media Mobile. We launched this summer and have been adding great new content and case studies, in English, Spanish, and Arabic. We now have a few pages available in Russian, too, with more to come. 


Stop on by to see what we're up to. Find us on Facebook, follow us on Twitter, or reach out to us here to submit your own stories from the field or alert us to great new mobile media tools.
]]></description>
<dc:subject>Technology data engagement media mobile poll sms software visualisation</dc:subject>
<dc:identifier>https://pinboard.in/u:anu/b:775ed36f002f/</dc:identifier>
<taxo:topics><rdf:Bag>	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:Technology"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:data"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:engagement"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:media"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:mobile"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:poll"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:sms"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:software"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:visualisation"/>
</rdf:Bag></taxo:topics>
</item>
<item rdf:about="http://coding.smashingmagazine.com/2011/10/12/prefixfree-break-free-from-css-prefix-hell/">
    <title>Break Free From CSS Prefix Hell</title>
    <dc:date>2011-10-12T16:06:40+00:00</dc:date>
    <link>http://coding.smashingmagazine.com/2011/10/12/prefixfree-break-free-from-css-prefix-hell/</link>
    <dc:creator>anu</dc:creator><description><![CDATA[Comments]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:2b5af45fdbd6/</dc:identifier>
</item>
<item rdf:about="http://www.woothemes.com/2011/10/woothemes-at-wordcamp-cape-town/">
    <title>WooThemes at WordCamp Cape Town</title>
    <dc:date>2011-10-04T08:41:58+00:00</dc:date>
    <link>http://www.woothemes.com/2011/10/woothemes-at-wordcamp-cape-town/</link>
    <dc:creator>anu</dc:creator><description><![CDATA[

WordCamp Cape Town took place last month at the iconic V&A Waterfront with Table Mountain as the backdrop. 6 of the WooThemes team members were representing and engaging with WordPress & WooThemes users. 

Highlights
Below is a short 2 minute video of the day’s activities. WordCamp was slickly & professionally organised by Ashley Shaw of LightSpeed. Ashley also happens to be one of our most advanced Canvas theme users, check out his portfolio for some incredible mods!



Using WordPress as a development framework
Using WordPress as a development framework aims to alleviate the overhead associated with common activities performed in Web development. WordPress gives you a base set of application functionality such as user management, routing, caching, that you don’t need to build from scratch.

This session will show you how easy it is to implement a public frontend, backend, and admin area for users, as well as a basic API and other advanced functions.



The Business of WordPress: Making Money in more ways than one
WordPress has grown into a very diverse ecosystem, where its users have cultivated multiple different opportunities to create & build a business. Commercial themes have been the most obvious / mainstream success, but beyond theming there’s still so many untapped opportunities.

This session briefly explores some of the more untapped opportunities.



See more WordCamp Cape Town talks on the dedicated YouTube channel.

From left to right: Cobus Bester, Byron Rode, Adrian Myburgh, Mark Forrester, Jason Bagley, Adii Pienaar, Charl Norman, Nur Ahmad Furlong.

]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:1f901d368f23/</dc:identifier>
</item>
<item rdf:about="http://www.smashingmagazine.com/2011/09/30/wordpress-essentials-how-to-create-a-wordpress-plugin/">
    <title>WordPress Essentials: How To Create A WordPress Plugin</title>
    <dc:date>2011-09-30T11:16:19+00:00</dc:date>
    <link>http://www.smashingmagazine.com/2011/09/30/wordpress-essentials-how-to-create-a-wordpress-plugin/</link>
    <dc:creator>anu</dc:creator><description><![CDATA[



        
        
          
        
         
        
          
        
         
        
          
        
      



WordPress plugins are PHP scripts that alter your website. The changes could be anything from the simplest tweak in the header to a more drastic makeover (such as changing how log-ins work, triggering emails to be sent, and much more).

Whereas themes modify the look of your website, plugins change how it functions. With plugins, you can create custom post types, add new tables to your database to track popular articles, automatically link your contents folder to a “CDN” server such as Amazon S3… you get the picture.



Theme Or Plugin?
If you’ve ever played around with a theme, you’ll know it has a functions.php file, which gives you a lot of power and enables you to build plugin-like functionality into your theme. So, if we have this functions.php file, what’s the point of a plugin? When should we use one, and when should we create our own?

The line here is blurrier than you might think, and the answer will often depend on your needs. If you just want to modify the default length of your posts’ excerpts, you can safely do it in functions.php. If you want something that lets users message each other and become friends on your website, then a plugin would better suit your needs.

The main difference is that a plugin’s functionality persists regardless of what theme you have enabled, whereas any changes you have made in functions.php will stop working once you switch themes. Also, grouping related functionality into a plugin is often more convenient than leaving a mass of code in functions.php.

Creating Our First PlugIn
To create a plugin, all you need to do is create a folder and then create a single file with one line of content. Navigate to the wp-content/plugins folder, and create a new folder named awesomeplugin. Inside this new folder, create a file named awesomeplugin.php. Open the file in a text editor, and paste the following information in it:


<?php
   /*
   Plugin Name: Awesomeness Creator
   Plugin URI: http://my-awesomeness-emporium.com
   Description: a plugin to create awesomeness and spread joy
   Version: 1.2
   Author: Mr. Awesome
   Author URI: http://mrtotallyawesome.com
   License: GPL2
   */
?>

Of all this information, only the plugin’s name is required. But if you intend to distribute your plugin, you should add as much data as possible.

With that out of the way, you can go into the back end to activate your plugin. That’s all there is to it! Of course, this plugin doesn’t do anything; but strictly speaking, it is an active, functioning plugin.

Structuring PlugIns
When creating complex functionality, splitting your plugin into multiple files and folders might be easier. The choice is yours, but following a few good tips will make your life easier.

If your plugin focuses on one main class, put that class in the main plugin file, and add one or more separate files for other functionality. If your plugin enhances WordPress’ back end with custom controls, you can create the usual CSS and JavaScript folders to store the appropriate files.

Generally, aim for a balance between layout structure, usability and minimalism. Split your plugin into multiple files as necessary, but don’t go overboard. I find it useful to look at the structure of popular plugins such as WP-PageNavi and Akismet.

Naming Your PlugIn And Its Functions
When creating a plugin, exercise caution in naming the functions, classes and plugin itself. If your plugin is for generating awesome excerpts, then calling it “excerpts” and calling its main function “the_excerpt” might seem logical. But these names are far too generic and might clash with other plugins that have similar functionality with similar names.

The most common solution is to use unique prefixes. You could use “acme_excerpt,” for example, or anything else that has a low likelihood of matching someone else’s naming scheme.

Plugin Safety
If you plan to distribute your plugin, then security is of utmost importance, because now you are fiddling with other people’s websites, not just your own. All of the security measures you should take merit their own article, so keep an eye out for an upcoming piece on how to secure your plugin. For now, let’s just look at the theory in a nutshell; you can worry about implementation once you grasp that.

The safety of your plugin usually depends on the stability of its two legs. One leg makes sure that the plugin does not help spread naughty data. Guarding against this entails filtering the user’s input, escaping queries to protect against SQL injection attacks and so on. The second leg makes sure that the user has the authority and intention to perform a given action. This basically means that only users with the authority to delete data (such as administrators) should be able to do it. Guarding intention ensures that visitors aren’t misled by a hacker who has managed to place a malicious link on your website.

All of this is much easier to do than you might think, because WordPress gives you many functions to handle it. A number of other issues and best practices are involved, however, so we’ll cover those in a future article. There is plenty to learn and do until then; if you’re just starting out, don’t worry about all that for now.

Cleaning Up After Yourself
Many plugins are guilty of leaving a lot of unnecessary data lying around. Data that only your plugin uses (such as meta data for posts or comments, database tables, etc.) can wind up as dead weight if the plugin doesn’t clean up after itself.

WordPress offers three great hooks to help you take care of this:


register_activation_hook()
This hook allows you to create a function that runs when your plugin is activated. It takes the path to your main plugin file as the first argument, and the function that you want to run as the second argument. You can use this to check the version of your plugin, do some upgrades between versions, check for the correct PHP version and so on.
register_deactivation_hook()
The name says it all. This function works like its counterpart above, but it runs whenever your plugin is deactivated. I suggest using the next function when deleting data; use this one just for general housekeeping.
register_uninstall_hook()
This function runs when the website administrator deletes your plugin in WordPress’ back end. This is a great way to remove data that has been lying around, such as database tables, settings and what not. A drawback to this method is that the plugin needs to be able to run for it to work; so, if your plugin cannot uninstall in this way, you can create an uninstall.php file. Check out this function’s documentation for more information.

If your plugin tracks the popularity of content, then deleting the tracked data when the user deletes the plugin might not be wise. In this case, at least point the user to the location in the back end where they can find the plugin’s data, or give them the option to delete the data on the plugin’s settings page before deleting the plugin itself.

The net result of all our effort is that a user should be able to install your plugin, use it for 10 years and then delete it without leaving a trace on the website, in the database or in the file structure.

Documentation And Coding Standards
If you are developing for a big community, then documenting your code is considered good manners (and good business). The conventions for this are fairly well established — phpDocumentor is one example. But as long as your code is clean and has some documentation, you should be fine.

I document code for my own benefit as well, because I barely remember what I did yesterday, much less the purpose of functions that I wrote months back. By documenting code, you force good practices on yourself. And if you start working on a team or if your code becomes popular, then documentation will be an inevitable part of your life, so you might as well start now.

While not quite as important as documentation, following coding standards is a good idea if you want your code to comply with WordPress’ guidelines.

Putting It Into Practice
All work and no play makes Jack a dull boy, so let’s do something with all of this knowledge that we’ve just acquired. To demonstrate, let’s build a quick plugin that tracks the popularity of our articles by storing how many times each post has been viewed. I will be using hooks, which we’ll cover in an upcoming installment in this series. Until then, as long as you grasp the logic behind them, all is well; you will understand hooks and plugins before long!

Planning Ahead
Before writing any code, let’s think ahead and try to determine the functions that our plugin will need. Here’s what I’ve come up with:


A function that registers a view every time an individual post is shown,
A function that enables us to retrieve the raw number of views,
A function that enables us to show the number of views to the user,
A function that retrieves a list of posts based on their view count.

Preparing Our Function
The first step is to create the folder and file structure. Putting all of this into one file will be fine, so let’s go to the plugins folder and create a new folder named awesomely_popular. In this folder, create a file named awesomely_popular.php. Open your new file, and paste some meta data at the top, something like this:


<?php
   /*
   Plugin Name: Awesomely Popular
   Plugin URI: http://awesomelypopularplugin.com
   Description: A plugin that records post views and contains functions to easily list posts by popularity
   Version: 1.0
   Author: Mr. Awesome
   Author URI: http://mayawesomefillyourbelly.com
   License: GPL2
   */
?>

Recording Post Views
Without delving too deep, WordPress hooks enable you to (among other things) fire off one of your functions whenever another WordPress function runs. So, if we can find a function that runs whenever an individual post is viewed, we are all set; all we would need to do is write our own function that records the number of views and hook it in. Before we get to that, though, let’s write the new function itself. Here is the code:


/**
 * Adds a view to the post being viewed
 *
 * Finds the current views of a post and adds one to it by updating
 * the postmeta. The meta key used is "awepop_views".
 *
 * @global object $post The post object
 * @return integer $new_views The number of views the post has
 *
 */
function awepop_add_view() {
   if(is_single()) {
      global $post;
      $current_views = get_post_meta($post->ID, "awepop_views", true);
      if(!isset($current_views) OR empty($current_views) OR !is_numeric($current_views) ) {
         $current_views = 0;
      }
      $new_views = $current_views + 1;
      update_post_meta($post->ID, "awepop_views", $new_views);
      return $new_views;
   }
}

As you can see, I have added phpDocumentor-style documentation to the top of the function, and this is a pretty good indication of what to expect from this convention. First of all, using a conditional tag, we determine whether the user is viewing a post on a dedicated page.

If the user is on a dedicated page, we pull in the $post object, which contains data about the post being shown (ID, title, posting date, comment count, etc.). We then retrieve the number of views that the post has already gotten. We will add 1 to this and then overwrite the orignal value with the new one. In case something goes wrong, we first check whether the current view count is what it should be.

The current view count must be set; it cannot be empty. And it must be numeric in order for us to be able to add 1 to it. If it does not meet these criteria, then we could safely bet that the current view count is 0. Next, we add 1 to it and save it to the database. Finally, we return the number of views that the post has gotten, together with this latest number.

So far, so good. But this function is never called, so it won’t actually be used. This is where hooks come in. You could go into your theme’s files and call the function manually from there. But then you would lose that functionality if you ever changed the theme, thus defeating the entire purpose. A hook, named wp_head, that runs just before the </head> tag is present in most themes, so we can just set our function to run whenever wp_head runs, like so:


add_action("wp_head", "awepop_add_view");

That’s all there is to the “mysticism” of hooks. We are basically saying, whenever wp_head runs, also execute the awepop_add_view function. You can place the code before or after the function itself.

Retrieving and Showing the Views
In the function above, I already use the WordPress get_post_meta() function to retrieve the views, so writing a separate function for this might seem a bit redundant. In this case, it might well be redundant, but it promotes some object-oriented thinking, and it gives us greater flexibility when further developing the plugin. Let’s take a look:


/**
 * Retrieve the number of views for a post
 *
 * Finds the current views for a post, returning 0 if there are none
 *
 * @global object $post The post object
 * @return integer $current_views The number of views the post has
 *
 */
function awepop_get_view_count() {
   global $post;
   $current_views = get_post_meta($post->ID, "awepop_views", true);
   if(!isset($current_views) OR empty($current_views) OR !is_numeric($current_views) ) {
      $current_views = 0;
   }

   return $current_views;
}

This is the same piece of code that we used in the awepop_add_view() function, so you could just use this to retrieve the view count there as well. This is handy, because if you decide to handle the 0 case differently, you only need to change it here. You will also be able to extend this easily and provide support for cases when we are not in the loop (i.e. when the $post object is not available).

So far, we have just retrieved the view count. Now, let’s show it. You might be thinking this is daft — all we need is echo awepop_get_view_count() . "views", no? That would certainly work, but what if there is only 1 view. In this case, we would need to use the singular “view.” You might also want the freedom to add some leading text or some other tidbit, which would be difficult to do otherwise. So, to allow for these scenarios, let’s write another simple function:


/**
 * Shows the number of views for a post
 *
 * Finds the current views of a post and displays it together with some optional text
 *
 * @global object $post The post object
 * @uses awepop_get_view_count()
 *
 * @param string $singular The singular term for the text
 * @param string $plural The plural term for the text
 * @param string $before Text to place before the counter
 *
 * @return string $views_text The views display
 *
 */
function awepop_show_views($singular = "view", $plural = "views", $before = "This post has: ") {
   global $post;
   $current_views = awepop_get_view_count();

   $views_text = $before . $current_views . " ";

   if ($current_views == 1) {
      $views_text .= $singular;
   }
   else {
      $views_text .= $plural;
   }

   echo $views_text;

}

Show a List of Posts Based on Views
To show a list of posts based on view count, we create a function that we can place anywhere in our theme. The function will use a custom query and loop through the results, displaying a simple list of titles. The code is below, and the explanation follows.


/**
 * Displays a list of posts ordered by popularity
 *
 * Shows a simple list of post titles ordered by their view count
 *
 * @param integer $post_count The number of posts to show
 *
 */
function awepop_popularity_list($post_count = 10) {
   $args = array(
      "posts_per_page" => 10,
      "post_type" => "post",
      "post_status" => "publish",
      "meta_key" => "awepop_views",
      "orderby" => "meta_value_num",
      "order" => "DESC"
   );

   $awepop_list = new WP_Query($args);

   if($awepop_list->have_posts()) {
      echo "
";
   }

   while ( $awepop_list->have_posts() ) : $awepop_list->the_post();
   echo "
".the_title('', '', false)."

";
   endwhile;

   if($awepop_list->have_posts()) {
      echo "

";
   }

}

We start by passing a bunch of parameters to the WP_Query class, in order to create a new object that contains some posts. This class will do the heavy lifting for us: it finds 10 published posts that have awepop_views in the meta table, and orders them according to this property in descending order.

If posts meet this criterion, we create an unordered list element. Then, we loop through all of the posts that we have retrieved, showing each title as a link to the relevant post. We cap things off by adding a closing tag to the list when there are posts to show. Placing the awepop_popularity_list() function anywhere in your theme should now generate a simple list of posts ordered by popularity.

As an added precaution, place the call to this function in your theme, like so:


if (function_exists("awepop_popularity_list")) {
   awepop_popularity_list();
}

This ensures that if the plugin is disabled (and thus the function becomes undefined), PHP won’t throw a big ol’ error. It just won’t show the list of most popular posts.

Overview
By following the theory laid down in this article and using only a handful of functions, we have created a rudimentary plugin to track our most popular posts. It could be vastly improved, but it shows the basics of using plugins perfectly well. Moreover, by learning some patterns of WordPress development (plugins, hooks, etc.), you are gaining skills that will serve you in non-WordPress environments as well.

You should now be able to confidently follow tutorials that start with “First, create a WordPress plugin…” You now understand things not just on a need-to-know basis, but at a deeper level, which gives you more flexibility and power when coding your own plugins. Stay tuned for the upcoming article on hooks, actions and filters for an even more in-depth resource on the innards of plugins.

(al)


© Daniel Pataki for Smashing Magazine, 2011.
]]></description>
<dc:subject>Developer's_Toolbox</dc:subject>
<dc:identifier>https://pinboard.in/u:anu/b:9544003bd95d/</dc:identifier>
<taxo:topics><rdf:Bag>	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:Developer's_Toolbox"/>
</rdf:Bag></taxo:topics>
</item>
<item rdf:about="https://docs.google.com/present/view?id=dkx3qtm_22dxsrgcf4&amp;pli=1">
    <title>Idiot's guide to viewports and media queries</title>
    <dc:date>2011-09-26T12:34:58+00:00</dc:date>
    <link>https://docs.google.com/present/view?id=dkx3qtm_22dxsrgcf4&amp;pli=1</link>
    <dc:creator>anu</dc:creator><description><![CDATA[Comments]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:2cc485d282cf/</dc:identifier>
</item>
<item rdf:about="http://objology.blogspot.com/2011/09/one-of-best-bits-of-programming-advice.html?spref=tw">
    <title>One of the Best Bits of Programming Advice I ever Got</title>
    <dc:date>2011-09-26T12:34:53+00:00</dc:date>
    <link>http://objology.blogspot.com/2011/09/one-of-best-bits-of-programming-advice.html?spref=tw</link>
    <dc:creator>anu</dc:creator><description><![CDATA[Comments]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:d606f5b65c11/</dc:identifier>
</item>
<item rdf:about="http://www.wired.com/autopia/2011/09/787-flight-training/">
    <title>Try Before You Fly: How Dreamliner Pilots Train Without Lifting Off</title>
    <dc:date>2011-09-26T12:34:51+00:00</dc:date>
    <link>http://www.wired.com/autopia/2011/09/787-flight-training/</link>
    <dc:creator>anu</dc:creator><description><![CDATA[Comments]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:fe663e62c7cb/</dc:identifier>
</item>
<item rdf:about="http://www.smashingmagazine.com/2011/09/22/wordpress-essentials-interacting-with-the-wordpress-database/">
    <title>WordPress Essentials: Interacting With The WordPress Database</title>
    <dc:date>2011-09-22T08:13:21+00:00</dc:date>
    <link>http://www.smashingmagazine.com/2011/09/22/wordpress-essentials-interacting-with-the-wordpress-database/</link>
    <dc:creator>anu</dc:creator><description><![CDATA[



        
        
          
        
         
        
          
        
         
        
          
        
      



While you already use many functions in WordPress to communicate with the database, there is an easy and safe way to do this directly, using the $wpdb class. Built on the great ezSQL class by Justin Vincent, $wpdb enables you to address queries to any table in your database, and it also helps you handle the returned data. Because this functionality is built into WordPress, there is no need to open a separate database connection (in which case, you would be duplicating code), and there is no need to perform hacks such as modifying a result set after it has been queried.


The $wpdb class modularizes and automates a lot of database-related tasks.

In this article, I will show you how to get started with the $wpdb class, how to retrieve data from your WordPress database and how to run more advanced queries that update or delete something in the database. The techniques here will remove some of the constraints that you run into with functions such as get_posts() and wp_list_categories(), allowing you to tailor queries to your particular needs. This method can also make your website more efficient by getting only the data that you need — nothing more, nothing less.

Getting Started
If you know how MySQL or similar languages work, then you will be right at home with this class, and you will need to keep only a small number of function names in mind. The basic usage of this class can be best understood through an example, so let’s query our database for the IDs and titles of the four most recent posts, ordered by comment count (in descending order).


<?php
   $posts = $wpdb->get_results("SELECT ID, post_title FROM wp_posts WHERE post_status = 'publish'
   AND post_type='post' ORDER BY comment_count DESC LIMIT 0,4")
?>

As you can see, this is a basic SQL query, with some PHP wrapped around it. The $wpdb class contains a method (a method is a special name for functions that are inside classes), named get_results(), which will not only fetch your results but put them in a convenient object. You might have noticed that, instead of using wp_posts for the table’s name, I have used $wpdb->posts, which is a helper to access your core WordPress tables. More on why to use these later.

The $results object now contains your data in the following format:


Array
(
   [0] => stdClass Object
      (
         [ID] => 6
         [post_title] => The Male Angler Fish Gets Completely Screwed
      )

   [1] => stdClass Object
      (
         [ID] => 25
         [post_title] => 10 Truly Amazing Icon Sets From Germany
      )

   [2] => stdClass Object
      (
         [ID] => 37
         [post_title] => Elderberry Is Awesome
      )

   [3] => stdClass Object
      (
         [ID] => 60
         [post_title] => Gathering Resources and Inspiration With Evernote
      )

)

Retrieving Results From The Database
If you want to retrieve some information from the database, you can use one of four helper functions to structure the data.

get_results()
This is the function that we looked at earlier. It is best for when you need two-dimensional data (multiple rows and columns). It converts the data into an array that contains separate objects for each row.


<?php
   $posts = $wpdb->get_results("SELECT ID, post_title FROM wp_posts WHERE post_status = 'future'
   AND post_type='post' ORDER BY post_date ASC LIMIT 0,4")

   // Echo the title of the first scheduled post
   echo $posts[0]->post_title;
?>

get_row
When you need to find only one particular row in the database (for example, the post with the most comments), you can use get_row(). It pulls the data into a one-dimensional object.


<?php
   $posts = $wpdb->get_row("SELECT ID, post_title FROM wp_posts WHERE post_status = 'publish'
   AND post_type='post' ORDER BY comment_count DESC LIMIT 0,1")

   // Echo the title of the most commented post
   echo $posts->post_title;
?>

get_col
This method is much the same as get_row(), but instead of grabbing a single row of results, it gets a single column. This is helpful if you would like to retrieve the IDs of only the top 10 most commented posts. Like get_row(), it stores your results in a one-dimensional object.


<?php
   $posts = $wpdb->get_col("SELECT ID FROM wp_posts WHERE post_status = 'publish'
   AND post_type='post' ORDER BY comment_count DESC LIMIT 0,10")

   // Echo the ID of the 4th most commented post
   echo $posts[3]->ID;
?>

get_var
In many cases, you will need only one value from the database; for example, the email address of one of your users. In this case, you can use get_var to retrieve it as a simple value. The value’s data type will be the same as its type in the database (i.e. integers will be integers, strings will be strings).


<?php
   $email = $wpdb->get_var("SELECT user_email FROM wp_users WHERE user_login = 'danielpataki' ")

   // Echo the user's email address
   echo $email;
?>

Inserting Into The Database
To perform an insert, we can use the insert method:


$wpdb->insert( $table, $data, $format);

This method takes three arguments. The first specifies the name of the table into which you are inserting the data. The second argument is an array that contains the columns and their respective values, as key-value pairs. The third parameter specifies the data type of your values, in the order you have given them. Here’s an example:


<?php
   $wpdb->insert($wpdb->usermeta, array("user_id" => 1, "meta_key" => "awesome_factor", "meta_value" => 10), array("%d", %s", "%d"));

   // Equivalent to:
   // INSERT INTO wp_usermeta (user_id, meta_key, meta_value) VALUES (1, "awesome_factor", 10);
?>

If you’re used to writing out your inserts, this may seem unwieldy at first, but it actually gives you a lot of flexibility because it uses arrays as inputs.

Specifying the format is optional; all values are treated as strings by default, but including this in the method is a good practice. The three values you can use are %s for strings, %d for decimal numbers and %f for floats.

Updating Your Data
By now, you won’t be surprised to hear that we also have a helper method to update our data — shockingly, called update(). Its use resembles what we saw above; but to handle the where clause of our update, it needs two extra parameters.


$wpdb->update( $table, $data, $where, $format = null, $where_format = null );

The $table, $data and $format parameters should be familiar to you; they are the same as before. Using the $where parameter, we can specify the conditions of the update. It should be an array in the form of column-value pairs. If you specify multiple parameters, then they will be joined with AND logic. The $where_format is just like $format: it specifies the format of the values in the $where parameter.


$wpdb->update( $wpdb->posts, array("post_title" => "Modified Post Title"), array("ID" => 5), array("%s"), array("%d") );

Other Queries
While the helpers above are great, sometimes performing different or more complex queries than the helpers allow is necessary. If you need to perform an update with a complex where clause containing multiple AND/OR logic, then you won’t be able to use the update() method. If you wanted to do something like delete a row or set a connection character set, then you would need to use the “general” query() method, which let’s you perform any sort of query.


$wpdb->query("DELETE FROM wp_usermeta WHERE meta_key = 'first_login' OR meta_key = 'security_key' ");

Protection And Validation
I hope I don’t have to tell you how important it is to make sure that your data is safe and that your database can’t be tampered with! Data validation is a bit beyond the scope of this article, but do take a look at what the WordPress Codex has to say about “Data Validation” at some point.

In addition to validating, you will need to escape all queries. Even if you are not familiar with SQL injection attacks, still use this method and then read up on it later, because it is critical.

The good news is that if you use any of the helper functions, then you don’t need to do anything: the query is escaped for you. If you use the query() method, however, you will need to escape manually, using the prepare() method.


$sql = $wpdb->prepare( 'query' [, value_parameter, value_parameter ... ] );

To make this a bit more digestible, let’s rewrite this basic format a bit.


$sql = $wpdb->prepare( "INSERT INTO $wpdb->postmeta (post_id, meta_key, meta_value ) VALUES ( %d, %s, %d )", 3342, 'post_views', 2290 )
$wpdb->query($sql);

As you can see, this is not that scary. Instead of adding the actual values where you usually would, you enter the type of data, and then you add the actual data as subsequent parameters.

Class Variables And Other Methods
Apart from these excellent methods, there are quite a few other functions and variables to make your life easier. I’ll show you some of the most common ones, but please do look at the WordPress Codex page linked to above for a full list of everything that $wpdb has to offer.

insert_id()
Whenever you insert something into a table, you will very likely have an auto-incrementing ID in there. To find the value of the most recent insert performed by your script, you can use $wpdb->insert_id.


$sql = $wpdb->prepare( "INSERT INTO $wpdb->postmeta (post_id, meta_key, meta_value ) VALUES ( %d, %s, %d )", 3342, 'post_views', 2290 )
   $wpdb->query($sql);

   $meta_id = $wpdb->insert_id;

num_rows()
If you’ve performed a query in your script, then this variable will return the number of results of your last query. This is great for post counts, comment counts and so on.

Table Names
All the core table names are stored in variables whose names are exactly the same as their core table equivalent. The name of your posts table (probably wp_posts) would be stored in the $posts variable, so you could output it by using $wpdb->posts.

We use this because we are allowed to choose a prefix for our WordPress tables. While most people use the default wp, some users want or need a custom one. For the sake of flexibility, this prefix is not hardcoded, so if you are writing a plug-in and use wp_postmeta in a query instead of $wpdb->postmeta, your code will not work on some websites.

If you want to get data from a non-core WordPress table, no special variable will be available for it. In this case, you can just write the table’s name as usual.

Error Handling
By calling the show_errors() or hide_errors() methods, you can turn error-reporting on or off (it’s off by default) to get some more info about what’s going on. Either way, you can also use the print_error() method to print the errors for the latest query.


$wpdb->show_errors();
   $wpdb->query("DELETE FROM wp_posts WHERE post_id = 554 ");

   // When run, because show_errors() is set, the error message will tell you that the "post_id" field is an unknown
   // field in this table (since the correct field is ID)

Building Some Basic Tracking With Our New $wpdb Knowledge
If you’re new to all of this, you probably get what I’m going on about but may be finding it hard to implement. So, let’s take the example of a simple WordPress tracking plug-in that I made for a website.

For simplicity’s sake, I won’t describe every detail of the plug-in. I’ll just show the database’s structure and some queries.

Our Table’s Structure
To keep track of ad clicks and impressions, I created a table; let’s call it “tracking.” This table records user actions in real time. Each impression and click is recorded in its own row in the following structure:


ID
The auto-incremented ID.
time
The date and time that the action occurred.
deal_id
The ID of the deal that is connected to the action (i.e. the ad that was clicked or viewed).
action
The type of action (i.e. click or impression).
action_url
The page on which the action was initiated.
user_id
If the user is logged in, their ID.
user_ip
The IP of the user, used to weed out any naughty business.

This table will get pretty big pretty fast, so it is aggregated into daily statistics and flushed periodically. But let’s just work with this one table for now.

Inserting Data Into Our Tables
When a user clicks an ad, it is detected, and the information that we need is sent to our script in the form of a $_POST array, with the following data:


Array
(
   [deal_id] => 643
   [action] => click
   [action_url] => http://thisiswhereitwasclicked.com/about/
   [user_id] => 223
   [user_ip] = 123.234.223.12
)

We can then insert this data into the database using our helper method, like so:


$wpdb->insert('tracking', array("deal_id" => 643, "action" => "click", "action_url" => "http://thisiswhereitwasclicked.com/about/",
"user_id" => 223, "user_ip" => "123.234.223.12"), array("%d", %s", "%s", "%d", "%s"));

At the risk of going on a tangent, I’ll address some questions you might have about this particular example. You may be thinking, what about data validation? The click could have come from a website administrator, or a user could have clicked twice by mistake, or a bunch of other things might have happened.

We decided that because we don’t need real-time stats (daily stats is enough), there is no point to check the data at every insert. Data is aggregated into a new table every day around midnight, a low traffic time. Before aggregating the data, we take care to clean it up, taking out duplicates and so on. The data is, of course, escaped before being inserted into the table, because we are using a helper function; so, we are safe there.

Just deleting in bulk all at once the ones that are made by administrators is easier than checking at every insert. This takes a considerable amount of processing off our server’s shoulders.

Deleting Actions From a Blacklisted IP
If we find that the IP address 168.211.23.43 is being naughty-naughty, we could blacklist it. In this case, when we aggregate the daily data, we would need to delete all of the entries by this IP.


$sql = $wpdb->prepare("DELETE FROM tracking WHERE user_ip = %s ", '168.211.23.43');
   $wpdb->query($sql);

You have probably noticed that I am still escaping the data, even though the IP was received from a secure source. I would suggest escaping your data no matter what. First of all, proper hackers are good at what they do, because they are excellent programmers and can outsmart you in ways that you wouldn’t think of. Also, I personally have done more to hurt my own websites than hackers have, so I do these things as a safety precaution against myself as well.

Updating Totals
We store our ads as custom post types; and to make statistical reporting easier, we store the total amount of clicks that an ad receives separately as well. We could just add up all of the clicks in our tracking database for the given deal as well, so let’s look at that first.


$total = $wpdb->get_var("SELECT COUNT(ID) WHERE deal_id = 125 ");

Because getting a single variable is easier than always burdening ourselves with a more complex query, whenever we aggregate our data, we would store the current total separately. Our ads are stored as posts with a custom post type, so a logical place to store this total is in the postmeta table. Let’s use the total_clicks meta key to store this data.


$wpdb->update( $wpdb->postmeta, array("meta_value" => $total), array("ID" => 125), array("%d"), array("%d") );

   // note that this should be done with update_post_meta(), I just did it the way I did for example's sake

Final Thoughts And Tips
I hope you have gained a better understanding of the WordPress $wpdb class and that you will be able to use it to make your projects better. To wrap up, here are some final tips and tricks for using this class effectively.


I urge you to be cautious: with great power comes great responsibility. Make sure to escape your data and to validate it, because improper use of this class is probably a leading cause of hacked websites!
Ask only for the data that you need. If you will only be displaying an article’s title, there is no need to retrieve all of the data from each row. In this case, just ask for the title and the ID: SELECT title, ID FROM wp_posts ORDER BY post_date DESC LIMIT 0,5.
While you can use the query() method for any query, using the helper methods (insert, update, get_row, etc.) is better if possible. They are more modular and safer, because they escape your data automatically.
Take care when deleting records from a WordPress (or any other) database. When WordPress deletes a comment, a bunch of other actions also take place: the comment count in the wp_posts table needs to be reduced by one, all of the data in the comment_meta table needs to be deleted as well, and so on. Make sure to clean up properly after yourself, especially when deleting things.
Look at all of the class variables and other bits of information in the official documentation. These will help you use the class to its full potential. I also recommend looking at the ezSQL class for general use in your non-WordPress projects; I use it almost exclusively for everything I do.

Further Reading

WordPress database basics and schema, WordPress Codex
Documentation on $wpdb, WordPress Codex
“Data validation,” WordPress Codex
“SQL Injection,” Wikipedia
“SQL Injection Attacks by Example,” Steve Friedl
ezSQL class documentation, Justin Vincent

(al)


© Daniel Pataki for Smashing Magazine, 2011.
]]></description>
<dc:subject>WordPress</dc:subject>
<dc:identifier>https://pinboard.in/u:anu/b:e22bd1101a2a/</dc:identifier>
<taxo:topics><rdf:Bag>	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:WordPress"/>
</rdf:Bag></taxo:topics>
</item>
<item rdf:about="http://publisherblog.automattic.com/?p=1712">
    <title>Publisher Blog: TIME.com Running Verticals on WordPress.com VIP</title>
    <dc:date>2011-09-21T15:16:35+00:00</dc:date>
    <link>http://publisherblog.automattic.com/?p=1712</link>
    <dc:creator>anu</dc:creator><description><![CDATA[Great piece yesterday in paidcontent.org about how TIME.com is leveraging the WordPress.com VIP SaaS platform to run all their vertical sites. In the post TIME.com cites their internal Omniture numbers, stating that ” ..verticals drove 40 percent of total site visits in 2011.“

It’s great to see Techland, Swampland, Battleland, and other TIME.com verticals that run on WordPress.com VIP highlighted in this article:

“In developing the vertical strategy, we decided to pinpoint areas of reader and advertiser interest, blow them out as mini-publications in their own right,” (Jim) Frederick (the site’s managing editor) said. “The idea was to get writers who can speak to Tech enthusiasts for Techland or personal finance fans at Moneyland, and forge new readerships, while still embracing our core audience and feeling familiar to our Time loyalists, too.””

LightBox, an amazing photography blog that lives on WordPress.com VIP and then connects effortlessly to Twitter, Facebook, and Tumblr, is a great example of WordPress as a digital hub. TIME.com uses the WordPress site to draw in audiences from various services back to the core content.

Nice work TIME.com team !



Ready to become a VIP Services Client? Some of the world’s biggest brands rely on WordPress.com VIP Services.

         ]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:15f04e801724/</dc:identifier>
</item>
<item rdf:about="http://weblogtoolscollection.com/?p=10498">
    <title>Weblog Tools Collection: WordPress Plugin Releases for 9/20</title>
    <dc:date>2011-09-20T13:00:29+00:00</dc:date>
    <link>http://weblogtoolscollection.com/?p=10498</link>
    <dc:creator>anu</dc:creator><description><![CDATA[New plugins
PHPLeague allows you to to manage your sports leagues and can be used for many different sports like football (soccer), basketball, handball, volleyball and even ice-hockey.

Updated plugins
Google XML Sitemaps will generate a special XML sitemap which will help search engines to better index your blog.

Posts 2 Posts allows you to create many-to-many connections between posts of all kinds.

WP-Table Reloaded enables you to create and manage tables in your admin area. No HTML knowledge is needed.

]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:c872a2f4e285/</dc:identifier>
</item>
<item rdf:about="http://alexking.org/?p=7260">
    <title>Alex King: wp_publish_post() Does Not Set post_*</title>
    <dc:date>2011-09-19T15:44:20+00:00</dc:date>
    <link>http://alexking.org/?p=7260</link>
    <dc:creator>anu</dc:creator><description><![CDATA[The inline documentation for wp_publish_post() says that it will:

Publish a post by transitioning the post status.

and that’s exactly what it does. Moreover, that’s all it does.

If you are creating a draft post via wp_insert_post() (or wp_update_post(), which calls wp_insert_post()), certain defaults will be set for you when the post status is set to publish (or future, etc.). Among these is the automatic creation of the post_name from the post_title (if none has been explicitly provided) and setting post_date_gmt.

I had some code on my site that was hitting a service to get data, creating a draft, adding some meta data and taxonomy information, then publishing it. When I was initially doing this (and using wp_publish_post() instead of wp_update_post()), I was ending up with published, unnamed posts. Not what I had in mind.

There are two ways around this:


Use wp_update_post() instead of wp_publish_post(). This works fine, but it’s a little heavier, and conceptually I think the code reads better with the wp_publish_post() call instead.
Use wp_publish_post(), but make sure to set the post_name, post_date_gmt, etc. when you create your draft post via wp_insert_post().

For what it’s worth, I was using wp_update_post(), switched to wp_publish_post() because it seemed cleaner, and have since gone back to wp_update_post(). Using less of my own code and letting WordPress core code do more work for me feels more future-proof.

Hopefully this is useful to someone else who starts digging through the code and is having trouble deciding which of the various functions to use.
]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:244511226ef6/</dc:identifier>
</item>
<item rdf:about="http://wpdevel.wordpress.com/2011/09/18/write-a-tutorial-for-setting-up-a-local-dev-environment/">
    <title>Write a tutorial for setting up a local dev environment</title>
    <dc:date>2011-09-18T23:42:10+00:00</dc:date>
    <link>http://wpdevel.wordpress.com/2011/09/18/write-a-tutorial-for-setting-up-a-local-dev-environment/</link>
    <dc:creator>anu</dc:creator><description><![CDATA[A section of the core contributor handbook will be about how to set up a local test install, including a web server, Subversion, and WordPress. Because of the various operating systems and software packages out there, we’re going to need a few different tutorials.

I need some people willing to write up procedures for a number of standard setups. This includes:


WordPress on XAMPP (both Windows and Mac) MAMP, and MacPorts
TortoiseSVN and a tutorial on command-line Subversion usage, including co, up, revert, diff; patch; conflicts, etc.
Whatever you Linux guys use  

I’d also love an article on getting the test suite up and running. Anything I’m missing?

So, for these procedures, people can volunteer (probably for their current setup). Once steps are written, others will need to test them. Many procedures may heavily borrow from or link to outside resources (such as the vendor sites themselves) — this is fine. And, there may already be some good things in the Codex or on other sites about getting WordPress running. Again, fine. (There are SVN articles by both @westi and @markjaquith, and those are probably great to start from.) Gather links, screenshots, further reading, whatever will help.

So, who is in?
         ]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:33e7dc1f78c8/</dc:identifier>
</item>
<item rdf:about="http://itechtalks.blogspot.com/2011/09/quality-ruby-on-rails-resources-and.html">
    <title>Quality Ruby on Rails Resources and Tutorials</title>
    <dc:date>2011-09-18T00:51:10+00:00</dc:date>
    <link>http://itechtalks.blogspot.com/2011/09/quality-ruby-on-rails-resources-and.html</link>
    <dc:creator>anu</dc:creator><description><![CDATA[Comments]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:84476d79150c/</dc:identifier>
</item>
<item rdf:about="http://www.roughtype.com/archives/2011/09/raise_high_the_1.php">
    <title>Raise high the paywalls, publishers</title>
    <dc:date>2011-09-15T21:28:53+00:00</dc:date>
    <link>http://www.roughtype.com/archives/2011/09/raise_high_the_1.php</link>
    <dc:creator>anu</dc:creator><description><![CDATA[This is the third in a series of occasional pieces on the transformation of the newspaper business. The first two pieces, both published in 2009, were The Writing Is on the Paywall and Google in the Middle.


Information doesn't want to be free. Nor does it want to be expensive. Information wants to be reasonably priced. And when it's reasonably priced, it gets purchased.


The internet has changed patterns of supply and demand in media businesses in profound ways. We're not going back to the way things used to be. But it's a mistake to assume that the contours of the landscape in the immediate aftermath of the disruption are the permanent contours of the landscape. New patterns of supply and demand - and, in turn, new ways of doing business - emerge to replace old ones, though it can take a long time for those patterns to mature and become stable. And in the meantime, there can be a whole lot of wreckage to clean up.


The arrival of Napster and its various progeny gave rise to the assumption that the recorded music business was doomed, that no one would ever pay for music again. That assumption, which at the time seemed entirely reasonable, has proved wrong. Plenty of people now purchase music through online stores like iTunes and Amazon.com, and a growing number are purchasing subscriptions to music services like Spotify. (I recently signed up for a five-bucks-a-month Spotify plan and, despite the mediocre sound quality and the annoying gaps in the tunebase, I'm pretty happy so far.) Music is being paid for even though (a) attempts to restrict music trading through digital-rights-management schemes have failed, and (b) most of the songs being purchased can, without too much trouble, be found and downloaded for free. People, it turns out, are generally happy to pay for convenience, for the assurance of quality, and for legitimacy. (The music industry's distasteful program of suing kids for downloading craploads of free tunes actually worked; it put a little bit of fear into the minds of downloaders - and their parents.)


Similar trends have been unfolding in the motion-picture business. In addition to going out to theaters, people continue to buy and rent recorded movies and other shows, in both physical and virtual forms. What we've witnessed in the recording industries in general is that the internet has actually expanded, not constricted, the ways people consume media. In particular, we've seen the establishment of five modes of consumption,* four of which produce revenue for the supplier: 


1. Unit purchase. Buy an item (song, album, movie, TV show, etc.) for a fixed price in order to own it in (theoretical) perpetuity. 


2. Subscription. Pay a recurring fee to access a collection of items. The fee may be variable, tied to limits on access and use.


3. Rental. Pay a nonrecurring fee to access a particular item or a collection of items for a set period of time.


4. Ad-subsidized. Watch or listen for free, but with some form of advertising included.


5. Freeloading. Unauthorized copying or trading.


The consumption of online recordings, via all these modes, has both cannibalized and supplemented the consumption of physical media. Though physical media sales, rentals, and subscriptions have fallen, often drastically, they have not been entirely supplanted. The reason is that, even when it comes to information, a virtual good is not always a perfect substitute for a physical good. Anyone who has had their viewing of a movie interrupted as Netflix recalibrates its streaming quality in response to a fluctuation in bandwidth knows that physical media still have advantages. Those advantages will almost certainly continue to erode as online offerings improve, but they may never be erased entirely.


The expansion in modes of consumption, which is now being extended still further as a result of the proliferation of networked gadgets like smartphones and tablets, each of which offers a somewhat different experience, doesn't necessarily mean an expansion in the profits of suppliers. It seems pretty clear that the music business will never enjoy the same profitability it did back in the CD days. (As someone who bought a whole lot of recordings at exorbitant prices, I can't say this breaks my heart.) But it does show that there are still plenty of people willing to pay plenty of money for informational products, even when those products have no physical form and are freely traded online.


The newspaper business - or, more generally, the written-word business - is different from the music and the movie business. Generally speaking, a news story is a lot more fungible than a song or a film. When I want to hear a particular song, no other song is going to be a satisfying substitute, but when I want to read about the outcome of a Congressional vote, I'm a whole lot less fussy about which story supplies the details. And whereas people may listen to a song a lot of times and watch a movie quite a few times, it's rare for a person to read a news story more than once. Such differences have led some observers to argue that, even if other media products find a price online, news stories never will. People will just never pay for what newspapers produce. 


Recent evidence suggests, however, that that's another mistaken assumption, again born of a belief that current circumstances will persist. Newspaper paywalls, long scoffed at, are beginning to pay off, both by producing a new stream of subscription fees and by protecting traditional print subscriptions. It was once thought that paywalls would work only for business-oriented papers like the Wall Street Journal and the Financial Times, but smartly constructed paywalls, which strike the right balance in supporting both ad-subsidized consumption and subscription consumption, are now showing signs of success for mainstream papers as well. See, for instance, Felix Salmon's piece on the New York Times's "porous paywall," Ellie Behling's review of the paywalls at the Concord Monitor, Augusta Chronicle, and Tulsa World, and John Lafayette's article on the Arkansas Democrat Gazette's well-established paywall. And a growing number of papers and other publications, from the Dallas Morning News to the Intelligencer Journal-Lancaster New Era, are testing paywall variations, which will help the industry gain a better sense of what works and what doesn't. In fact, a recent study reveals that about half of all small newspapers now charge for online content in some way, and most of the rest are planning to institute paywalls.


Newspapers are also getting smarter about distinguishing between the more fungible and the less fungible elements of their products - and focusing their talents and investments on the latter. Less fungible means more distinctive, and distinctiveness in written news can manifest itself in many forms, from news analyses, to human-interest narratives, to smartly written editorial columns, to editorial skill in creating a bundle of stories, to compelling packages of local news and event coverage. Finally, and crucially important, the huge overabundance of supply in the news market, a consequence of the collapse of geographical boundaries that traditionally separated newspapers, is slowly ebbing as journalists are laid off and newspapers go under. The pruning of supply is ugly, but, from a business standpoint, it's both inevitable and necessary.


What we're coming to understand is that, in the newspaper business as in the music and motion-picture businesses, convenience, assurance of quality, and legitimacy are valued by consumers. Mainstream news consumers are not news geeks. They do not want to spend an inordinate amount of time flitting among sites, aggregation services, RSS readers, and tweet streams to cobble together a sense of what's happening in the world. Many of them will choose to pay for convenience, assurance of quality, and legitimacy, and, as with music and movies, they will likely pay in a variety of ways - unit purchases, subscriptions, even rentals - depending on their needs. Many others will refuse to pay, limiting themselves to what's available in purely ad-subsidized models. (And, of course, there will be plenty of freeloaders who take pride and pleasure in figuring out ways to defeat paywalls.) The newspapers that will survive, and perhaps even thrive, in the years to come will be those that are able to offer the most distinctive products and to tailor those products to a variety of consumption modes, spanning payment methods and devices, in a way that maximizes revenues and optimizes readership. And because an online news site is not a perfect substitute for a printed paper for either readers or advertisers - I cancelled my paper subscription a couple of years ago but ended up resubscribing after realizing that I was missing something - print editions will likely remain a crucial element in the mix indefinitely.


There is a group of new-media pundits - let's call them the Self-Appointed Guardians of Web Orthodoxy (SAGWOs) - who encourage newspapers to launch all sorts of online distribution and editorial experiments. That's good advice. But the SAGWOs have heaped scorn on experiments with paywalls and subscriptions and pricing. That's terrible advice. Newspapers and magazines need to test all sorts of ways to get people to pay for news. That's the only way to secure a vibrant future for quality journalism. Many of the experiments will fail. But some will succeed. And, eventually, we'll see the emergence of sustainable, robust new business models, probably characterized by a broader set of revenue sources than existed before. If the last decade was the decade of digital destruction for newspapers, the current decade may turn out to be the decade of rebuilding. 
____


*I realize that there are some who will take offense at my use of the c-word - "consumption" - as it conflicts with their belief that the web has made media consumption obsolete. But that's silly. The people formerly known as the audience still spend a lot of time behaving like an audience. I doubt that's going to change.
]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:3c8e14dc66a0/</dc:identifier>
</item>
<item rdf:about="http://www.wptavern.com/?p=5419">
    <title>WPTavern: Using WordPress To Create Multiple Image Sizes</title>
    <dc:date>2011-09-14T18:45:20+00:00</dc:date>
    <link>http://www.wptavern.com/?p=5419</link>
    <dc:creator>anu</dc:creator><description><![CDATA[WPBeginner has an excellent tutorial that describes how to use the built in functions of WordPress to generate additional image sizes for use in themes. This is possibly a better alternative than using TimThumb. 



Related posts:Screencast: Basic Image Editing In WordPress 2.9

]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:b04a102bd3e5/</dc:identifier>
</item>
<item rdf:about="http://www.poynter.org/how-tos/career-development/ask-the-recruiter/144925/live-chat-today-kim-bui-on-how-to-stand-out-as-a-communitysocial-media-editor/">
    <title>Kim Bui on how to stand out as a community/social media editor</title>
    <dc:date>2011-09-13T04:01:17+00:00</dc:date>
    <link>http://www.poynter.org/how-tos/career-development/ask-the-recruiter/144925/live-chat-today-kim-bui-on-how-to-stand-out-as-a-communitysocial-media-editor/</link>
    <dc:creator>anu</dc:creator><description><![CDATA[In this week’s career chat, we talked with Kim Bui, community editor and social media specialist at Southern California Public Radio’s KPCC-FM. Bui wears several hats in her role, working at the station and in the community. She… Read more
]]></description>
<dc:subject>Social_media Media_Lab Latest_News</dc:subject>
<dc:identifier>https://pinboard.in/u:anu/b:201d9d2af44d/</dc:identifier>
<taxo:topics><rdf:Bag>	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:Social_media"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:Media_Lab"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:Latest_News"/>
</rdf:Bag></taxo:topics>
</item>
<item rdf:about="http://www.poynter.org/latest-news/media-lab/mobile-media/145623/how-the-boston-globe-built-an-all-in-one-website-web-app-and-mobile-site/">
    <title>How the Boston Globe built an all-in-one website, Web app and mobile site</title>
    <dc:date>2011-09-12T10:35:28+00:00</dc:date>
    <link>http://www.poynter.org/latest-news/media-lab/mobile-media/145623/how-the-boston-globe-built-an-all-in-one-website-web-app-and-mobile-site/</link>
    <dc:creator>anu</dc:creator><description><![CDATA[What is the newly launched BostonGlobe.com? Depending on what type of device you use to view it, you might guess it’s a regular desktop website, a tablet Web app, or a mobile phone site.

All of those answers are… Read more
]]></description>
<dc:subject>Media_Lab Latest_News</dc:subject>
<dc:identifier>https://pinboard.in/u:anu/b:c66e37dcffe6/</dc:identifier>
<taxo:topics><rdf:Bag>	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:Media_Lab"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:Latest_News"/>
</rdf:Bag></taxo:topics>
</item>
<item rdf:about="http://www.poynter.org/latest-news/top-stories/145687/subscription-only-bostonglobe-com-launches-with-boston-com-free/">
    <title>Paywalled BostonGlobe.com launches, while Boston.com remains free</title>
    <dc:date>2011-09-12T10:33:29+00:00</dc:date>
    <link>http://www.poynter.org/latest-news/top-stories/145687/subscription-only-bostonglobe-com-launches-with-boston-com-free/</link>
    <dc:creator>anu</dc:creator><description><![CDATA[The Boston Globe moves most of its content behind a paywall today, to a new website aimed at people who want to immerse themselves in the Globe’s journalism.

The longstanding Boston.com remains a free site, including teasers for all Globe… Read more
]]></description>
<dc:subject>Latest_News</dc:subject>
<dc:identifier>https://pinboard.in/u:anu/b:031546484a59/</dc:identifier>
<taxo:topics><rdf:Bag>	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:Latest_News"/>
</rdf:Bag></taxo:topics>
</item>
<item rdf:about="http://michael.peopleofhonoronly.com/vim/">
    <title>Vim Cheat Sheet - For Programmers By Programmers</title>
    <dc:date>2011-09-09T10:00:05+00:00</dc:date>
    <link>http://michael.peopleofhonoronly.com/vim/</link>
    <dc:creator>anu</dc:creator><description><![CDATA[Comments]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:07dffb84b926/</dc:identifier>
</item>
<item rdf:about="http://wordpress.tv/?p=7214">
    <title>WordPress.tv: Scott Taylor: WordPress in the Enterprise at eMusic</title>
    <dc:date>2011-09-08T14:32:26+00:00</dc:date>
    <link>http://wordpress.tv/?p=7214</link>
    <dc:creator>anu</dc:creator><description><![CDATA[

         ]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:5e59d4db1653/</dc:identifier>
</item>
<item rdf:about="http://wordpress.tv/?p=7218">
    <title>WordPress.tv: Steve Zehngut: How To Hire and Manage a Developer</title>
    <dc:date>2011-09-08T11:34:24+00:00</dc:date>
    <link>http://wordpress.tv/?p=7218</link>
    <dc:creator>anu</dc:creator><description><![CDATA[

         ]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:b14d2bcfef4c/</dc:identifier>
</item>
<item rdf:about="http://wordpress.tv/?p=7326">
    <title>WordPress.tv: Andrew Nacin: Debugging in WordPress</title>
    <dc:date>2011-09-07T15:15:13+00:00</dc:date>
    <link>http://wordpress.tv/?p=7326</link>
    <dc:creator>anu</dc:creator><description><![CDATA[

         ]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:e3ed1e3e4d8c/</dc:identifier>
</item>
<item rdf:about="http://wordpress.tv/?p=7157">
    <title>WordPress.tv: Barry Abrahamson: Ask Barry (About Scaling, Servers, or WordPress.com Infrastructure)</title>
    <dc:date>2011-09-07T15:00:10+00:00</dc:date>
    <link>http://wordpress.tv/?p=7157</link>
    <dc:creator>anu</dc:creator><description><![CDATA[

         ]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:12dee054e5e6/</dc:identifier>
</item>
<item rdf:about="http://www.smashingmagazine.com/2011/09/05/getting-started-with-the-paypal-api/">
    <title>Getting Started With The PayPal API</title>
    <dc:date>2011-09-05T12:23:35+00:00</dc:date>
    <link>http://www.smashingmagazine.com/2011/09/05/getting-started-with-the-paypal-api/</link>
    <dc:creator>anu</dc:creator><description><![CDATA[



      
        
    



PayPal is the most popular platform for receiving online payments today. The ease of opening a PayPal account and receiving payments compared to opening a merchant account with a traditional payment gateway is probably the number one reason for its popularity, with a close second being the comprehensive API that PayPal provides for its payment services.

Disclaimer: PayPal’s API is among the worst I’ve ever had to deal with. Inconsistencies, sometimes poor or conflicting documentation, unpredictable failures and account changes, and major differences between the live and sandbox versions all conspire to make the PayPal API quite a pain in the arse to work with. Over the years, I’ve taken my lumps from working quite a bit with the PayPal API, and I’ve published the results of my hard-learned lessons as a commercial PHP PayPal API component on the source-code marketplace Binpress.

In this post, I will break down some of the techniques and approaches to working with the PayPal API, in order to make integration and troubleshooting simpler and easier.



The Different Payment Options
PayPal offers a variety of payment options, which might be confusing at first:


Express Checkout
The premier PayPal service. Express Checkout allows you to receive payments without having a merchant account and without having to meet special requirements other than verifying your account (either via a bank account or a credit card). Previously, you could receive Express Checkout payments from PayPal users only, but PayPal has since added a credit-card option for non-PayPal users, making this service accessible to practically anyone with a major credit card. Note that the Express Checkout process occurs on PayPal’s platform and thus can never be fully integrated in your website’s experience.
Direct Payment
The Direct Payment method allows you to receive credit-card payments directly through an API call. This enables you to host the payment process on your website in full, which might make for a more complete shopping experience for your customers. The Direct Payment method has several variations that enable you to authorize a payment and complete it at a later date: the appropriately named Authorization and Capture methods. These variations are a part of the Website Payments Pro API, which is available only to US, Canadian and UK accounts.
Recurring Payments
This allows you to set up a recurring transaction (i.e. a subscription payment).
Mass Payments
This allows you to transfer money to multiple accounts at once.
Adaptive Payments
Here is another API for sending funds to multiple recipients, with some differences from the Mass Payments API. (Did I mention that the PayPal API is confusing and a bit redundant?)

This list is not comprehensive, but it covers the main payment options (see the API documentation for more).

Making API Requests
PayPal supports two main formats over HTTP: NVP and SOAP. NVP is short for Name-Value Pair, and SOAP stands for Simple Object Access Protocol. I will cover the NVP approach, which I prefer to SOAP’s relatively verbose and complex syntax.

Each of the API methods has different parameters, but they all share some basic parameters, which are used to identify the API account and sign the transaction. These include:


USER
Your PayPal API user name.
PWD
Your PayPal API password.
VERSION
The version number of the NVP API service, such as 74.0 (the most recent as of this writing).
SIGNATURE
Your PayPal API signature string. This parameter is optional if you use a certificate to authenticate.

The last required parameter is METHOD, which declares which API method we are calling.

Requests are made over HTTPS. We’ll use cURL to build our basic request, and then encapsulate the process in a class:


class Paypal {
   /**
    * Last error message(s)
    * @var array
    */
   protected $_errors = array();

   /**
    * API Credentials
    * Use the correct credentials for the environment in use (Live / Sandbox)
    * @var array
    */
   protected $_credentials = array(
      'USER' => 'seller_1297608781_biz_api1.lionite.com',
      'PWD' => '1297608792',
      'SIGNATURE' => 'A3g66.FS3NAf4mkHn3BDQdpo6JD.ACcPc4wMrInvUEqO3Uapovity47p',
   );

   /**
    * API endpoint
    * Live - https://api-3t.paypal.com/nvp
    * Sandbox - https://api-3t.sandbox.paypal.com/nvp
    * @var string
    */
   protected $_endPoint = 'https://api-3t.sandbox.paypal.com/nvp';

   /**
    * API Version
    * @var string
    */
   protected $_version = '74.0';

   /**
    * Make API request
    *
    * @param string $method string API method to request
    * @param array $params Additional request parameters
    * @return array / boolean Response array / boolean false on failure
    */
   public function request($method,$params = array()) {
      $this -> _errors = array();
      if( empty($method) ) { //Check if API method is not empty
         $this -> _errors = array('API method is missing');
         return false;
      }

      //Our request parameters
      $requestParams = array(
         'METHOD' => $method,
         'VERSION' => $this -> _version
      ) + $this -> _credentials;

      //Building our NVP string
      $request = http_build_query($requestParams + $params);

      //cURL settings
      $curlOptions = array (
         CURLOPT_URL => $this -> _endPoint,
         CURLOPT_VERBOSE => 1,
         CURLOPT_SSL_VERIFYPEER => true,
         CURLOPT_SSL_VERIFYHOST => 2,
         CURLOPT_CAINFO => dirname(__FILE__) . '/cacert.pem', //CA cert file
         CURLOPT_RETURNTRANSFER => 1,
         CURLOPT_POST => 1,
         CURLOPT_POSTFIELDS => $request
      );

      $ch = curl_init();
      curl_setopt_array($ch,$curlOptions);

      //Sending our request - $response will hold the API response
      $response = curl_exec($ch);

      //Checking for cURL errors
      if (curl_errno($ch)) {
         $this -> _errors = curl_error($ch);
         curl_close($ch);
         return false;
         //Handle errors
      } else  {
         curl_close($ch);
         $responseArray = array();
         parse_str($response,$responseArray); // Break the NVP string to an array
         return $responseArray;
      }
   }
}

Note that I use a CA certificate file for SSL certificate validation. You can obtain the file from the cURL website or any trusted source. Update the path to the certificate file according to where you’ve placed it.

The response returned will be in NVP format as well, and I reformat it into an array before returning it. A parameter named ACK signifies the status of the request: Success or SuccessWithWarning when the request succeeds, and Error or Warning when the request fails.

A request could fail for many reasons, and there are different reasons for each API method, which are covered in detail in the manual. We’ll go over some further down in this article and look at ways to handle them. Keep in mind that the parameter values are case-sensitive, so code against them accordingly.

Express Checkout
One of the most popular APIs is the Express Checkout API, which enables you to receive payments without opening a Website Payments Pro account (which is available only to verified US accounts) or hosting the actual transaction yourself (which requires additional security).

The Express Checkout process works as follows:


We request a checkout token from PayPal using the transaction details;
If successful, we redirect the user to the PayPal endpoint using the received token;
The user completes or cancels the payment on the PayPal platform and is redirected back to our website;
We complete the payment either when the user is redirected back or via an Instant Payment Notification (IPN).



1. Getting the Checkout Token: SetExpressCheckout
We initiate the Express Checkout process by passing the order details to the PayPal API, and we receive a token string that identifies it. This token would be used in the next step to redirect to PayPal.

Here are the required parameters:


METHOD
This is the API method that we’re using (i.e. SetExpressCheckout).
RETURNURL
The URL that the user will be redirected to after the payment process is completed.
CANCELURL
The URL that the user will be redirected to after having cancelled the payment process.
PAYMENTREQUEST_0_AMT
The transaction’s total amount. This must have two decimal places, with the decimal separator being a period (.). The optional thousands separator must be a comma (,).
PAYMENTREQUEST_0_ITEMAMT
The total cost of the items in the order, excluding shipping, taxes and other costs. If there are no extra costs, then it should be the same value as PAYMENTREQUEST_0_AMT.

We can pass additional parameters to add more information about the order, some of which have default values:


PAYMENTREQUEST_0_CURRENCYCODE
The payment’s currency, as a three-letter code. The default is USD.
PAYMENTREQUEST_0_SHIPPINGAMT
The total shipping costs for this order.
PAYMENTREQUEST_0_TAXAMT
The total tax amount for this order. This is required if per-item tax is specified (see below).
PAYMENTREQUEST_0_DESC
The order’s description.

We can also add details about individual items in the order:


L_PAYMENTREQUEST_0_NAMEm
The item’s name.
L_PAYMENTREQUEST_0_DESCm
The item’s description.
L_PAYMENTREQUEST_0_AMTm
The item’s cost.
L_PAYMENTREQUEST_0_QTYm
The quantity of an item.

The variable index m identifies the item. (Use the same variable for all details of the same item.)

There are many other optional parameters, which can be found in the API documentation.

We’ll use the function that we wrote above to build the SetExpressCheckout request:


//Our request parameters
$requestParams = array(
   'RETURNURL' => 'http://www.yourdomain.com/payment/success',
   'CANCELURL' => 'http://www.yourdomain.com/payment/cancelled'
);

$orderParams = array(
   'PAYMENTREQUEST_0_AMT' => '500',
   'PAYMENTREQUEST_0_SHIPPINGAMT' => '4',
   'PAYMENTREQUEST_0_CURRENCYCODE' => 'GBP',
   'PAYMENTREQUEST_0_ITEMAMT' => '496'
);

$item = array(
   'L_PAYMENTREQUEST_0_NAME0' => 'iPhone',
   'L_PAYMENTREQUEST_0_DESC0' => 'White iPhone, 16GB',
   'L_PAYMENTREQUEST_0_AMT0' => '496',
   'L_PAYMENTREQUEST_0_QTY0' => '1'
);

$paypal = new Paypal();
$response = $paypal -> request('SetExpressCheckout',$requestParams + $orderParams + $item);

2. Redirecting to PayPal Using the Checkout Express Token
If the request is successful, we’ll receive a checkout token in the TOKEN parameter of the response.


if(is_array($response) && $response['ACK'] == 'Success') { //Request successful
      $token = $response['TOKEN'];
      header( 'Location: https://www.paypal.com/webscr?cmd=_express-checkout&token=' . urlencode($token) );
}

The user now goes through the purchase process on PayPal’s website. When they confirm or cancel it, they will return to one of the URLs that we’ve specified in the request.

3. Completing the Transaction
Assuming the user confirms the transaction, they will be redirected to our website by PayPal. At this point, we should use two relevant API methods: DoExpressCheckoutPayment will complete the transaction, but before that we might want to get additional information on the buyer using GetExpressCheckoutDetails.

PayPal will redirect the user back from the purchase with the checkout token, which we will use to call those methods. The token will be available in the URL query parameters via the token parameter. We will check for its existence in the confirmation URL and then send our API requests if we find it.

The GetExpressCheckoutDetails method requires only the checkout token. DoExpressCheckoutPayment requires a couple of additional parameters:


PAYMENTREQUEST_0_PAYMENTACTION
This is the payment action. It should be set to Sale unless we’ve specified a different action in the SetExpressCheckout method (possible values include Authorization and Capture).
PAYERID
This is the unique identification for the PayPal account. This, too, is returned in the URL query parameters (in the PayerID parameter) and can also be retrieved from the details returned by GetExpressCheckoutDetails.


if( isset($_GET['token']) && !empty($_GET['token']) ) { // Token parameter exists
   // Get checkout details, including buyer information.
   // We can save it for future reference or cross-check with the data we have
   $paypal = new Paypal();
   $checkoutDetails = $paypal -> request('GetExpressCheckoutDetails', array('TOKEN' => $_GET['token']));

   // Complete the checkout transaction
   $requestParams = array(
      'PAYMENTREQUEST_0_PAYMENTACTION' => 'Sale',
      'PAYERID' => $_GET['PayerID']
   );

   $response = $paypal -> request('DoExpressCheckoutPayment',$requestParams);
   if( is_array($response) && $response['ACK'] == 'Success') { // Payment successful
      // We'll fetch the transaction ID for internal bookkeeping
      $transactionId = $response['PAYMENTINFO_0_TRANSACTIONID'];
   }
}

Direct Payment
The Direct Payment API allows you to receive payments directly on your website or application, giving you complete control over the checkout process. PayPal tends to push users to register and use a PayPal account, which is understandable, but this conflicts somewhat with our interest to make the payment process as simple and clear as possible for our customers. For this reason, full control over the checkout process is preferred and gives us more options to optimize sales and generate more sales.



The process is a bit simpler than that of Express Checkout, because the entire interaction occurs on our website, and we need to perform just one API call to process a normal payment: DoDirectPayment.

A couple of more API requests are required if you want to perform a transaction that is billed at a later date (for example, when you ship the product or confirm availability). These would be the Authorization & Capture API methods, which I will not cover in this post, but be aware that this option exists.

DirectPayment Parameters
DirectPayment requires different parameters than Express Checkout, as to be expected. While the transaction details parameters are similar (with different key names, to make it more interesting), the method also requires credit-card and address information.

DirectPayment’s basic parameters:


METHOD
This is DoDirectPayment.
IPADDRESS
This is the IP address of the payer. In PHP, we can retrieve it using the superglobal $_SERVER['REMOTE_ADDR']. You’ll have to do a bit more work to get the IP when dealing with set-ups that have a proxy between the PHP process and the outside network (such as nginx).
PAYMENTACTION
This is the type of action that we want to perform. A value of Sale indicates an immediate transaction. A value of Authorization indicates that this transaction will not be performed immediately, but rather will be captured later using the Authorization & Capture API mentioned earlier.

Credit-card details:


CREDITCARDTYPE
The credit-card type (Visa, MasterCard, etc.). See the API documentation for the full list.
ACCT
The credit-card number. (Don’t you love these abbreviated key names?) This must conform to the particular format of the card’s type.
EXPDATE
The expiration date, in MMYYYY format (i.e. a two-digit month and a four-digit year, as one string).
CVV2
The “card verification value,” or security code, as it’s sometimes known.

Payer information and address parameters:


FIRSTNAME, LASTNAME
The payer’s first name and last name, respectively (in separate fields). You can also provide an email address in an EMAIL parameter, but it’s not required.
CITY, STATE, COUNTRYCODE, ZIP
The city, state, country code (as a two-letter code) and zip code parts of the address, all required.
STREET, STREET2
Two lines for the address (only the first is required).

This address will be used in the address verification system (AVS). You’ll receive a specific error code if a transaction has failed due to an address verification failure.


The payment details parameters are the same as the ones for Express Checkout, but with slightly different names (AMT, ITEMAMT, CURRENCYCODE, SHIPPINGAMT, TAXAMT and DESC) and without the PAYMENTREQUEST_0_ prefix. Refer to the previous section or the API documentation for specific details on those.

Similarly, the item details parameters are similar to those of Express Checkout. These include L_NAMEm, L_DESCm, L_AMTm and L_QTYm, giving you granular control of item details in the order summary. The m integer variable is used to account for multiple items (replace with 0, 1 and so on for numbered items in the order). See the API documentation for a comprehensive list of item details.

Performing the Transaction
Sending the request using our function is very similar to GetExpressCheckoutToken. We pass all of the parameters into the request function as before, with the method set to DoDirectPayment.


$requestParams = array(
   'IPADDRESS' => $_SERVER['REMOTE_ADDR'],
   'PAYMENTACTION' => 'Sale'
);

$creditCardDetails = array(
   'CREDITCARDTYPE' => 'Visa',
   'ACCT' => '4929802607281663',
   'EXPDATE' => '062012',
   'CVV2' => '984'
);

$payerDetails = array(
   'FIRSTNAME' => 'John',
   'LASTNAME' => 'Doe',
   'COUNTRYCODE' => 'US',
   'STATE' => 'NY',
   'CITY' => 'New York',
   'STREET' => '14 Argyle Rd.',
   'ZIP' => '10010'
);

$orderParams = array(
   'AMT' => '500',
   'ITEMAMT' => '496',
   'SHIPPINGAMT' => '4',
   'CURRENCYCODE' => 'GBP'
);

$item = array(
   'L_NAME0' => 'iPhone',
   'L_DESC0' => 'White iPhone, 16GB',
   'L_AMT0' => '496',
   'L_QTY0' => '1'
);

$paypal = new Paypal();
$response = $paypal -> request('DoDirectPayment',
   $requestParams + $creditCardDetails + $payerDetails + $orderParams + $item
);

if( is_array($response) && $response['ACK'] == 'Success') { // Payment successful
   // We'll fetch the transaction ID for internal bookkeeping
   $transactionId = $response['TRANSACTIONID'];
}

There are plenty of parameters, but all relatively simple.

Error Handling
In a perfect world, this section would not exist. In reality, you will be referring to it quite a lot. PayPal can fail a transaction for a multitude of reasons, not all of which you can control.

The $response variable we returned from our paypalApiRequest() function could contain a different value than Success for the ACK parameter. That value could be:


Success
Indicates a successful operation.
SuccessWithWarning
Indicates a successful operation, and that messages were returned in the response that you should examine.
Failure
Indicates a failed operation, and that the response contains one or more error messages explaining the failure.
FailureWithWarning
Indicates a failed operation, and that messages were returned in the response that you should examine.

This gives us two success statuses and two failure statuses. The mock code above tests for the Success value only, but we could change it to check for SuccessWithWarning as well; and keep in mind that we need to find out what the warning is. A common scenario is that a Direct Payment charge will have been performed successfully, but the credit-card company responds that the transaction has failed, for whatever reason.

Errors from PayPal are returned in four parameters in the response:


L_ERRORCODE0
A numeric error code, which can referenced against PayPal’s error code list (there are quite a few).
L_SHORTMESSAGE0
A short error message describing the problem.
L_LONGMESSAGE0
A longer error message describing the problem.
L_SEVERITYCODE0
The severity code. (I couldn’t find any useful documentation on this, and it doesn’t really matter, so let’s put it aside.)

The 0 part of these parameters is an incrementing integer for multiple error message (1, 2, etc.).

Here are some common errors you’ll run into:


10002
Authentication or authorization failed. This usually indicates invalid API credentials, or credentials that do not match the type of environment you are working in (such as a live or sandbox environment).
81***
Missing parameter. There are quite a few of these, all starting with 81. Each refers to a specific required parameter that is missing from the request.
104**
Invalid argument. This indicates that one of the supplied parameters has an invalid value. Each argument has specific errors, all starting with 104. A common one is 10413, which means that the total cost of the cart items does not match the order’s amount (i.e. the total amount parameter, AMT, does not equal the items’ total plus shipping, handling, taxes and other charges).

How Do We Handle These Errors in Practice?
PayPal error messages vary and could contain private information that you do not want your users to see (such as an invalid merchant configuration). That being the case, showing PayPal error messages directly to users is not advisable, even though some of them might be useful.

In most cases, I would do the following:


Set up a white-list array of errors that can be shown safely (such as a missing credit-card number and expiration date);
Check the response code against that array;
If the error message is not white-listed, then display a generic message, such as “An error has occurred while processing your payment. Please try again in a few minutes, or contact us if this is a recurring issue.”

If an error falls outside of the white-listed array, I will also log it to a file on the server and send an email to the administrator, with the full details so that someone is up to speed on payment failures. In fact, logging PayPal requests and responses is good practice regardless of errors, so that you can monitor and troubleshoot payment failures (I provide this option in the commercial component that I mentioned at the beginning of this article).

Ready To Get Started With The PayPal API?
In this post, I’ve covered two of the most widely used API methods, as well as error handling with the PayPal API. This should be enough for you to get started using the most popular payment platform online.

The PayPal API has many more methods and processes, more than can be covered in any one post. Once you get up to speed on the basic methods, learning the others should be relatively straightforward (even if somewhat exhausting). I hope this guide has given you a good head start on using the API. If you have questions or comments, I would love to hear from you in the comments!

Front cover: Image source

(al)


© Eran Galperin for Smashing Magazine, 2011.
]]></description>
<dc:subject>Coding API PayPal PHP</dc:subject>
<dc:identifier>https://pinboard.in/u:anu/b:b54bed69c794/</dc:identifier>
<taxo:topics><rdf:Bag>	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:Coding"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:API"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:PayPal"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:PHP"/>
</rdf:Bag></taxo:topics>
</item>
<item rdf:about="http://www.dreamincode.net/forums/topic/54760-professional-level-login-design-pt-1/">
    <title>Professional Level Login Design [Pt.1] - PHP Tutorials</title>
    <dc:date>2011-09-04T14:02:20+00:00</dc:date>
    <link>http://www.dreamincode.net/forums/topic/54760-professional-level-login-design-pt-1/</link>
    <dc:creator>anu</dc:creator><description><![CDATA[Comments]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:b9abb8a5eab8/</dc:identifier>
</item>
<item rdf:about="http://www.tuaw.com/2011/08/31/how-the-ipad-is-changing-baseball/">
    <title>How the iPad is changing baseball</title>
    <dc:date>2011-08-31T19:30:00+00:00</dc:date>
    <link>http://www.tuaw.com/2011/08/31/how-the-ipad-is-changing-baseball/</link>
    <dc:creator>anu</dc:creator><description><![CDATA[



Baseball is undergoing a digital revolution thanks to the iPad and the iPhone. Sports fans, management and even players are using the iPad to improve America's favorite game. Fans can watch every Major League game on their phone or tablets. Managers can keep track of their rosters and players can analyze both their own performance and that of their competitors.


Companies like Baseball Info solutions have embraced this trend. The service compiles the statistics for every player in the Major Leagues and makes it available to all thirty MLB teams. Sports professionals are not alone in this move to a digital future. Recently, we took a look at Extra Innings Mobile Instructor, an app which lets coaches and parents record and analyze the technique of both hitters and pitchers.


And baseball isn't the only sport being transformed by the iPad. Recently, the Tampa Bay Buccaneers handed out iPads to all its players and management to replace the paper-based playbook.
How the iPad is changing baseball originally appeared on TUAW - The Unofficial Apple Weblog on Wed, 31 Aug 2011 14:30:00 EST.  Please see our terms for use of feeds.
Source | Permalink | Email this | Comments]]></description>
<dc:subject>baseball iPad sports team</dc:subject>
<dc:identifier>https://pinboard.in/u:anu/b:e86f30055362/</dc:identifier>
<taxo:topics><rdf:Bag>	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:baseball"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:iPad"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:sports"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:team"/>
</rdf:Bag></taxo:topics>
</item>
<item rdf:about="http://www.antipope.org/charlie/blog-static/2011/08/because-i-have-too-much-spare-.html">
    <title>Because I have too much spare time for reading ...</title>
    <dc:date>2011-08-25T14:57:14+00:00</dc:date>
    <link>http://www.antipope.org/charlie/blog-static/2011/08/because-i-have-too-much-spare-.html</link>
    <dc:creator>anu</dc:creator><description><![CDATA[What do you think is the most important novel of the past 10-and-a-bit years (published since January 1st 2000)?


Explain your reasoning. (Novels by "Charles Stross" are disqualified.)
]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:71b3a8da8d78/</dc:identifier>
</item>
<item rdf:about="http://uxmag.com/articles/introduction-to-design-studio-methodology">
    <title>Introduction to Design Studio Methodology</title>
    <dc:date>2011-08-24T16:30:42+00:00</dc:date>
    <link>http://uxmag.com/articles/introduction-to-design-studio-methodology</link>
    <dc:creator>anu</dc:creator><description><![CDATA[By Will Evans
    
            
                    Exploring opportunities and innovate products to better serve customers needs.

        
        

I first learned the Design Studio methodology from Todd Zaki Warfel, founder of Message First and perhaps one of the best designers I’ve been fortunate enough to learn from. The concept originated in architecture and industrial design schools, and I believe Todd was the first to apply it to collaborative design of complex software systems.



read more

   
]]></description>
<dc:subject>Strategy Requirements_and_Specifications</dc:subject>
<dc:identifier>https://pinboard.in/u:anu/b:30e0ae52a25c/</dc:identifier>
<taxo:topics><rdf:Bag>	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:Strategy"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:Requirements_and_Specifications"/>
</rdf:Bag></taxo:topics>
</item>
<item rdf:about="http://highscalability.com/blog/2011/8/22/strategy-run-a-scalable-available-and-cheap-static-site-on-s.html">
    <title>Strategy: Run A Scalable, Available, And Cheap Static Site On S3 Or GitHub</title>
    <dc:date>2011-08-23T12:59:35+00:00</dc:date>
    <link>http://highscalability.com/blog/2011/8/22/strategy-run-a-scalable-available-and-cheap-static-site-on-s.html</link>
    <dc:creator>anu</dc:creator><description><![CDATA[Comments]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:3d953a0a02de/</dc:identifier>
</item>
<item rdf:about="http://www.schneier.com/blog/archives/2011/08/cheating_at_cas.html">
    <title>Cheating at Casinos with Hidden Cameras</title>
    <dc:date>2011-08-23T10:44:58+00:00</dc:date>
    <link>http://www.schneier.com/blog/archives/2011/08/cheating_at_cas.html</link>
    <dc:creator>anu</dc:creator><description><![CDATA[Sleeve cameras aren't new, but they're now smaller than ever and the cheaters are getting more sophisticated:


In January, at the newly opened $4-billion Cosmopolitan casino in Las Vegas, a gang called the Cutters cheated at baccarat. Before play began, the dealer offered one member of the group a stack of eight decks of cards for a pre-game cut. The player probably rubbed the stack for good luck, at the same instant riffling some of the corners of the cards underneath with his index finger. A small camera, hidden under his forearm, recorded the order.

After a few hands, the cutter left the floor and entered a bathroom stall, where he most likely passed the camera to a confederate in an adjoining stall. The runner carried the camera to a gaming analyst in a nearby hotel room, where the analyst transferred the video to a computer, watching it in slow motion to determine the order of the cards. Not quite half an hour had passed since the cut. Baccarat play averages less than six cards a minute, so there were still at least 160 cards left to play through. Back at the table, other members of the gang were delaying the action, glancing at their cellphones and waiting for the analyst to send them the card order. 
]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:7072aa774394/</dc:identifier>
</item>
<item rdf:about="http://tobolds.blogspot.com/2011/08/crowd-control.html">
    <title>Crowd control</title>
    <dc:date>2011-08-23T07:08:00+00:00</dc:date>
    <link>http://tobolds.blogspot.com/2011/08/crowd-control.html</link>
    <dc:creator>anu</dc:creator><description><![CDATA[I didn't go to Gamescom this weekend. I easily could have, it's less than 2 hours away by train, and neither train tickets nor entry tickets were prohibitively priced. But based on my experience with conventions and videos I saw from previous Gamescoms, I decided that it would probably be too crowded to be enjoyable for me. That turned out to be an accurate prediction, with people reporting dangerously crowded conditions at the entrance, and queues of up to 4 hours wait for the privilege of trying out a new game for 10 minutes on Sunday. I probably got more info staying at home and watching videos on various websites about the games presented in Cologne than what I would have seen if I had been there.

Now one of the videos I saw was Total Biscuit's 25 minutes of SWTOR commented gameplay. And one thing that struck me was that obviously there were problems in the starter zone shown with mobs not spawning fast enough for the handful of people trying to kill them for their quests. I got flashbacks to the best screenshot of World of Warcraft that I failed to take: 10 players in Elwynn Forest on launch days camping a level 1 kobold spawn spot.

Now the video also showed the main story line quest locations being instanced, and I'm not sure if you could simply skip all the side quests and play without being bothered too much by the inevitable crowding on the first days. But the whole thing makes me wonder whether there isn't a better way to start a new MMORPG.

The problem in this sort of game for the moment is that your location is linked to your level. There simply aren't all that many places where a level 1 character can go in these quest-based, level-based games. By choosing your faction and class, you automatically already chose the list of chores and errands disguised as "quests" that your character is going to do early on in his career. And on launch day, everybody is level 1, and thus has the same laundry list of stuff to do as those of the same class. "Kill 10 womp rats" type of quests are already by themselves not very interesting. But if the 10 womp rat spawn points are camped by 50 players, those quests are getting downright annoying. And even if the main story is instanced, you can't help but constantly run across other players which are obviously on the same story, which makes it hard to feel special.

Now ideally in an open world setting there would be a huge wilderness populated by low-level monsters, in which starting players would be randomly distributed. So players would be alone, would get quests not from NPCs but by some sort of long-distance communication, and would spend their early days learning how to fight mobs in the wilderness and getting towards a city somewhere in the center of it. But even that approach is probably not going to work if you consider SWTOR already having sold  350,000 pre-orders in the US alone.

So I question the value of having the start be open world in Star Wars: The Old Republic. Wouldn't it be better if the first 10 levels would be completely instanced before releasing players into an open world? It isn't as if they were likely to want to group for the low levels anyway. Somebody starting a new character half a year after launch is likely to play through an empty starter zone anyway, so why not offer that experience to everybody right from the start?Tobold's MMORPG Blog]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:4f879fa7908d/</dc:identifier>
</item>
<item rdf:about="http://www.disambiguity.com/uxdo-workshop-facilitation/">
    <title>Notes from a very meta workshop on workshop facilitation (UXDO)</title>
    <dc:date>2011-08-22T12:34:07+00:00</dc:date>
    <link>http://www.disambiguity.com/uxdo-workshop-facilitation/</link>
    <dc:creator>anu</dc:creator><description><![CDATA[

A few months ago the wonderful Giles Colborne and I were given an interesting challenge by Sjors Timmer and Matthew Solle who were organising the UXDO event for August. Would we run a session on Workshop Facilitation.

Of course we would, but the question was… could we run a workshop about workshop facilitation?

Well, it was certainly worth a shot.

And so it was that twenty something very meta workshop participants bravely joined us last week for a workshop on workshop facilitation. It went a little something like this….


Workshop Plan: 
We posted our workshop plan, including timings, onto the wall.



The workshop was structured broadly following the KJ Technique with some collaborative affinity sorting and then ending with some group discussions on key topics. We structured the workshop in a way that promoted  a pattern of widely exploring the breadth of the problem area, then synthesis or exploration of the  patterns that emerge from our exploration and then consolidating into actions and findings.

7pm: Welcome
7.05pm: Private brainstorm (Exploring the problem space)

Question: What are the biggest challenges you face when putting on workshops?

Write challenges on to post it notes – one idea per post it notes, in capital letters using an appropriately heavy marker.

7.10pm:  Post up 

To save time we didn’t do the ideal thing of discussing each idea as they were called out (to
capture all the nuances). Instead we asked people to volunteer whether they had similar ideas and posted them in clusters. You wouldn’t want to do this in a ‘real’ workshop as you want to give people plenty of time for discussion.

7.40pm: Grouping and sorting

We did a collaborative affinity sort by gathered in small teams, giving each team some of the clusters of post-its and re-grouped the post-its into their final clusters. We labelled the clusters with problem statements. This allowed the group to understand what the real problems were and how issues that might on the surface appear different sometimes stem from the same problem.

7.55pm: Dot voting

We gave participants Three votes each to vote for the problems they felt were most significant in blocking their ability to run effective workshop sessions – these would be the topics participants wanted to discuss in more detail later in the evening.

8pm: 1-1 Ranking

Here we deviate a little from the KJ Method. We compared cards in pairs. Rank them all, according to the question ‘What is the bigger roadblock to you running an effective, productive workshop.

8.15pm: Group discussion

We broke into small groups and brainstorm the problems and solutions
Again, this took two parts: firstly, examine the problem – what is it? what causes it? – make notes about this at the top of the flip chart. Then solutions – what’s worked well? why? List ideas on the bottom half of the flip chart.

8.35pm: Groups present back
We heard from all the groups on their problems and solutions

8.58pm  Wrap up and head to the pub! (Although, in all honestly, we did end up running a little late… too much interesting discussion!)

Workshop planning tips:

TIP: Workshops are about the attendees, not your designs. Turn your attention outward. Make
the participants feel valued and listened to.

TIP: Every workshop needs to go through a phase of expansion (where you gather ideas) and exploration (where you understand ideas) and consolidation (where you set the outcomes). Your workshop structure should follow this flow.

TIP: The attendees have given up their valuable time to be there – recognise and respect this. Be clear about what you need from them, plan well, get as much as you can out of the day and communicate it back.

TIP: We posted the agenda and timings up on a big sheet at the front of the room. The agenda is not a secret and making it visible helps everyone to know where they are and where they’re going. It also means you can discuss it and make visible changes (if you need to) during the workshop.

TIP: When you’re planning your workshop remember its important to leave plenty of time at the end for your wrap up. People need to be heard. We’ve been to workshops where the moderator has ended by saying ‘we don’t have time for a wash-up, but please think about what we’ve said today.’ What a let down. Make sure there’s enough time to go around the room one last time.

TIP Make sure they’re putting just one idea per Post-It. Post-Its are the atoms of your workshop – and you don’t want to split the atom in the middle of a workshop.

The outputs: Affinity sort

These are the problem statements (and the related post-its) that we gathered.



Before the workshop

How do we know who to invite?
Inviting the right people | Getting the right people in the room | Decide who attends | Who is coming? (+ What do they do?) | Right people | Knowing about the likely audience

How do we agree on a date?
Agree on a date | Right time in the process

How do we communicate the problem to solve?
Describing the problem | Agreeing outcomes | Selling the whole idea | Agreeing the content, purpose, objective | The outcomes you need from it | Reason why | Agreed purpose

How do we create a good physical environment?
Venue & equipment | Cleaning the whiteboards | Venue | Choosing funky music | Maximising resources & space | When should I start to prepare | Right location | Finding a good space | Post it notes not sticking | Establishing the ‘right environment’ | Which alcohol to bring | What should I bring?

How do we make sure they’re in the room?
Making invitations that people will stick to | Make them show up | Getting people enthusiastic | Convincing stakeholders to participate

What to do?
How to structure the workshop | Lack of good methods | Appropriate method for participants | Which activities lead to the right results



During the workshop

How to manage time?
Knowing when to stop | Managing time

How do we get the group to work well together?
Group dynamics | Group social dynamics

How do we introduce the session?
Setting expectations | Warming up participants | Ensuring participants are prepared

How do we create the right social environment?
Break silos | Make people think creatively | Getting the client to pick up the pen | Breaking down the fear of collaboration

How to keep participants focused?
Keeping people on track | Retaining control of the group | Keeping participants on track (work issues) | Keeping people focused | Attendees not focused on listening (wondering mind) | Agenda saboutaged | Keep open without losing control

How do we best get people to participate?
Framing the right questions inspirationally | Communicating to the attendees appropriately | Knowing my own limits and strengths | Facilitating and guiding without stifling | participants not understanding workshop method or format | Letting go during the workshop – appropriately, of course

How do we maintain interest from all attendees throughout?
Keeping up energy | Going deep | Attention | Focus | Engagement | Keeping up momentum | Maintaining good, healthy energy | Going the long haul – energy



How do we deal with Hippos*, Wallflowers & Snipers
Overcoming ‘silent stares’ | Hippos! \ Handling strength of opinion | Negative attitudes | Encouraging people who are sceptical | Commitment | Wrong PX in the room – it’s not working! | Participant’s fear of coming up with bad ideas | Getting quiet folks to speak | Ensuring that everyone involved has a say | Shouty people | Avoiding one dominant voice | What to do with bigtime extroverts | People who hate workshop format as participants | Negative attitudes.
*Hippo – Highest Paid Person’s Opinion – i.e. important people who use their power from outside the workshop to override debate within the workshop.


After the workshop

How to communicate the outcomes of the workshop?
How to collate report on results | The what | Playing back findings | Summarising the workshop’s findings | Remembering details | Not missing something | Summarising efficiently | Who is writing up? | Processing — distilling

How to communicate the worth of the workshop?
Communicating the value of the workshop

How to act on stuff after the workshop?
Getting people to own actions.

How do we deal with a lack of consensus?
Managing differing opinions | Designing together without feeling the result is a big mess of compromise | Culture problems | Getting people to collaborate | Managing dissent | Divergent personalities | The personalities of people involved | Facilitating towards a good outcome

Tips for collaborative affinity sorting

TIP: Have someone to manage the labelling while the moderator leads the discussion.

TIP: We asked teams to begin each problem statement with the words ‘How do we…?’ so that we were sure these were real problems – questions that could be answered – rather than vague ‘stuff’.

TIP: There is no scientific way to approach this – point people to a bunch of post it notes and a space on the wall/table and have them get started – it will come together (and start to make more sense to everyone) as you go.

TIP: Encourage people to call out their groupings as they go. ‘I’m starting a group about scheduling over here’, ‘Does anyone have a section on difficult people yet?’ for example. The best way to encourage this is to lead by example.

TIP: Allow and spend plenty of time on this activity – it can be quite time consuming but is a format for having some really important discussions and building a shared understanding of the problem space. Have these discussions and push the group to make sure that the problem statement labels really accurately reflect the content that they represent. Don’t allow generalisations and ensure clarity.

The outputs: What the groups came up with in their short discussions on the key problems we explored.



Problem / solution – How do we communicate the problem to solve?


1. The problem
Not used to working together, no sense of being part of a wider team. Don’t speak the same language. See the problem differently – like that old chestnut of the blind men and the elephants. Don’t think there’s a problem. Think the solution is ‘obvious’ (we should just be doing what I say). Assume ‘my view is the true view’. Legacy of wrong thinking – commitment to wrong ideas or mindset.

2. The solution
Re-framing – make sure the problem is not described from one privileged viewpoint.
Don’t assume participants agree on the problem definition. Agree on the problem.
Listen to their views and opinions – respect. Weave their different views into a view of the problem.
Get a universally respected figure to set up the problem statement.
Get an outsider to state the problem (that’s what we do with user testing – users are our ‘outsiders’).
Bring it to life with examples. Case studies.
Encourage open discussion.

TIP: Always make sure you have clearly defined the problem(s) you’re attempting to resolve in your workshops and that everyone has a shared understanding of the problem and it’s importance/relevance.

TIP: Get the information into the world! – write your problem statements down, in clear, agreed, understood words and post them up in a visible place in the workshop venue. Refer to this liberally throughout the workshop and encourages others to do so.

TIP: Make your workshops a jargon free zone – don’t let others intimidate through use of language and make sure everyone feels comfortable asking others ‘what do you mean by that term’ or ‘what does that acronym stand for’. As every, the best way to achieve this is to lead by example – use the simplest language possible to convey your point, avoid jargon where possible (including UX jargon!) and explain it wherever it’s not possible to avoid it, don’t let people use language or terminology that you don’t understand – set the example by asking others to explain, even if everyone else in the room apparently understands what is going on (often they don’t either!)



What to do? (in your workshop)

1. The problem
It’s about lack of experience, not knowing the domain or culture, lack of confidence and it being too easy to stick with past methods.

2. The solution
Just do it – try something. Practice beforehand [so you feel confident in new methods]. Learn from others, be ready to make mistakes, learn by doing. Build up a good stock of resources. Talk to clients, colleagues, etc. Share your experiences. Take part in other people’s workshops – watch what they do.

TIP: Don’t get carried away always trying to come up with new techniques to use in your workshop. Make sure you’ve got a few options for each phase of opening, exploring and closing discussions and a few for the various ‘difficult people’ you might come across and focus on becoming really great a facilitating those. Others will come on your radar over time, pick them up when you see them.

TIP: Plan your workshop so that you spend time on opening, exploring and closing each problem/issue you’re trying to resolve or understand. There are no good shortcuts – skimping on any of these phases will negate the effectiveness of your workshop. Some workshops will be mostly exploring, or mostly resolving but pretty much all workshops need to go through all these phases in order for people to engage with them properly and for you to have somewhere to go to (a specific course of action) beyond the workshop.

TIP: If you’re doing something for the first time, do a pilot first. Yes, it takes some time what you learn from it will be invaluable and then you’ll be on top form for when it really counts. Respect your workshops participants more than to experiment on them on the fly if there’s any chance it could all come to nothing.



How to keep participants focused on the subject we’re workshopping? / How do we maintain interest throughout the workshop 


1. The problem
Facilitator hasn’t understood well, importance has not been communicated effectively, discussion goes in endless tangents, losing sight of the objectives, people expecting to talk about topics other than the planned ones.
Boring – the format doesn’t give people an opportunity to have fun, don’t want to be too bossy [that’s] not fun, lack of engaging activities.
Human factors – tiredness, need breaks, hunger, mood swings, good view out of the window.
Technology interrupts – email, phones.
Group dynamics – language barriers, bad mix of people in the room, people seeing people they haven’t seen in ages for a catch up, chatty people, people have their own topics they want to talk about.


2. The solution
Mixing up types of activities,
Give them sweets (controversy here over which ones and how to avoid sugar crashes!)
Plan breaks, phones and laptops off (promise they’ll have time to check later), more exciting creative activities, icebreaker to engage them from the start, make things relevant and practical, let people talk a/b themselves.

TIP: The absolute best way to keep people focussed is to make sure they understand clearly what they are doing and how it contributes to solving a problem that is important to them. This means making sure that the problem is clearly defined but also that you’re continually linking the activity you’re currently working on back to that and showing how it is all coming together.

TIP: Don’t let people feel that they’re wasting time – this means making sure that you’ve planned activities that clearly lead towards an valuable outcome, and making sure that people see where they are on the map – how does what they’re doing now get them to that outcome. Kee people in the loop, don’t go for a ‘big reveal’ at the end.

TIP: Make sure you plan reasonable length breaks at least every 90 minutes – to get more out of people over a longer stint, make sure that you are mixing up the format of your activities – get people on their feet, moving around the room, working in different groups, talking, writing, sketching – building variety into the format increases stamina.



How do we deal with difficult people / create the right environment?

1. The problem
Different knowledge levels | People feeling threatened | How do we deal with different people to get a representative outcome? |


2. The solution
Make sure you talk to people 1:1 before hand to warm them up | Communicate clear objectives | Choose activities and tactics that treat everyone equally | Herd the Hippos together | Break down hierarchies through play.

TIP: Make sure you know who is going to be in the room before you workshop, if you don’t know much about them try to get an insight into their personalities and use this knowledge to plan activities that will help get the best from the group.

TIP: Build up a repertoire of activities especially to deal with people who either dominate discussions or who are reluctant to contribute, if you find yourself ambushed by this situation in your workshop, be ready to change techniques on the fly rather than persisting with ineffective methods.

TIP: Read widely and talk to others about techniques for talking with difficult situations in workshop – memorise these and practice using them so you can confidently take control and steer the participation in a positive and productive way.

Reading list


Gamestorming: Gray, Brown, Macanufo (great overall manual with lots of suggested activities)
Facilitation at a glance: Bens (Leisa’s bible. Available in a spiral bound edition!)
How to run a great workshop: Highmore Sims (an alternative to Gamestorming)
Icebreakers: Tizzard & Evans (pocket sized book of useful icebreakers to keep in your bag)
How to make meetings work: Doyle & Strauss (good on the roles that people need to play in meetings – see also Kevin Hoffman’s Slideshare ‘I hate sports but I love kickoffs)
Dealing with difficult people: Brinkman & Kirshner (has a great framework for understanding and managing difficult people and simple strategies you can put into practice)
Games People Play: Berne (helpful in understanding when, why and how you’re being pulled into a negative relationship)
Team roles at work: Belbin (useful for understanding team dynamics and the value that different types of personalities bring to teams, see also Belbin’s website to get your personal profile – for a fee)

Thanks

Giles and I have lots of people to thank – this workshop happened because Sjors Timmer willed it into being and told the world (with Matthew Solle lurking in there, too) and thanks to the generosity of Fortune Cookie for giving us the space (and letting us in early) and providing the refreshments and human support in the forms of Jeff Van Campen and Matt Lindop. The attendees threw themselves into things and came up with lots of tips and ideas which we’ve tried to capture below. We hope we’ve done them justice (comments welcome).

Other people’s write ups

@francisrowland created these sketchnotes during the evening – it’s also his picture that is at the top of this blog post – thanks Francis!

And @timcaynes  gave an participant’s eye view on his blog

If we’ve missed any others, please let us know and we’ll add it here.



 
]]></description>
<dc:subject>user_experience</dc:subject>
<dc:identifier>https://pinboard.in/u:anu/b:e551ed76c7f2/</dc:identifier>
<taxo:topics><rdf:Bag>	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:user_experience"/>
</rdf:Bag></taxo:topics>
</item>
<item rdf:about="http://www.tuaw.com/2011/08/20/energizer-travel-charger-powers-your-mac-iphone-and-ipad-a/">
    <title>Energizer travel charger powers your Mac, iPhone, and iPad ... all at once</title>
    <dc:date>2011-08-20T17:00:00+00:00</dc:date>
    <link>http://www.tuaw.com/2011/08/20/energizer-travel-charger-powers-your-mac-iphone-and-ipad-a/</link>
    <dc:creator>anu</dc:creator><description><![CDATA[



I often travel with more than a few Apple devices, all of which usually need power at some point during the day, so the idea of this one intrigues me a lot, obviously. Energizer (the bunny people) is releasing a brand new travel charger that, as you can see above, goes industrial on charging your devices. not only does it expand an outlet into three, but there's a built-in iPhone dock, and even a USB charger to plug into on the side. That's some serious charge.


I'm sure if you plugged charging units into everything on the iSurge, you might run the risk of pulling off too much power -- especially if the outlet isn't set up right, it's hard to see how this wouldn't cause problems. Still, that's a handy little unit, even if you do end up using all of the various outlets at different times. The charger is indeed called the iSurge, and is set to be sold for $60 by the end of the year.


[via Wired]
Energizer travel charger powers your Mac, iPhone, and iPad ... all at once originally appeared on TUAW - The Unofficial Apple Weblog on Sat, 20 Aug 2011 12:00:00 EST.  Please see our terms for use of feeds.
Source | Permalink | Email this | Comments]]></description>
<dc:subject>accessories ios iPad iPhone mac travel</dc:subject>
<dc:identifier>https://pinboard.in/u:anu/b:0f863953793f/</dc:identifier>
<taxo:topics><rdf:Bag>	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:accessories"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:ios"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:iPad"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:iPhone"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:mac"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:travel"/>
</rdf:Bag></taxo:topics>
</item>
<item rdf:about="http://freelanceswitch.com/switchtips/freelancer-reputation-apps/">
    <title>7 Free Tools for Monitoring Your Freelance Reputation</title>
    <dc:date>2011-08-17T14:00:31+00:00</dc:date>
    <link>http://freelanceswitch.com/switchtips/freelancer-reputation-apps/</link>
    <dc:creator>anu</dc:creator><description><![CDATA[

Honest freelancers keep their word to get work done on time.  They value their reputation and their strong work ethic pays dividends. An enthusiastic customer recommendation about a freelancer’s performance can bring a number of new offers and better income.

It’s important to have several positive reviews in your profile. However, an experienced employer goes beyond these words and digs into more information about you. To keep tabs on your reputation online here are some simple, free tools that get the job done:

1. Google Search
Google

Don’t be surprised. Google you name. You may find work reviews you had no clue about. Check Google blogs and discussions tabs to see all posts. Besides, set Google Alerts to your name and get email notifications as soon as a new article with your name springs up. Thus, you keep track of your web reputation.



2. Twitter Search
Twitter Search

140 characters are enough to express opinion on a freelancer or give project feedback. Take a look at Twitter search to learn if someone is talking about you. Search for your name, nickname or recent projects. Join the conversation in case it’s necessary.

3. Quora
Quora

Numerous Q&A sites like Quora have tons of questions answered. Maybe one of them can be about your freelance business. Surf these places and keep an eye on important questions. Provide correct information firsthand.

4. Social Mention
Social Mention

Social Mention is a free online service that helps monitor on a topic or person-related comments. The web app works like an information aggregator bringing search, blogs, updates, and forum mentions all together. Social Mention shows top keywords associated with a topic, top authors who posted on the topic and indicates information sources. The app enables you to download reposts or subscribe via RSS. Social Mention is a bit slow; however, it’s free and gives plenty of information.

5.  Addict-o-matic
Addict-o-matic

Addict-o-matic resembles Social Mention, but it works faster. It helps analyze potential feedback sources at one place. You can pick up an information channel you want to track among search engines, bookmarks, news websites, blogs, etc. Unfortunately, there’s no report download option.

6. Twitrratr
Twitrratr

Twitrratr is a simple tool to differentiate positive, neutral and negative tweets on a freelancer or a topic. Try Twitrratr instead of usual Twitter search and see people’s opinions immediately divided into 3 categories. Thus, you know your audience’s feelings about your work.

7. Tweetreach
Tweetreach

It used to be hard to measure a tweet’s influence.  You had to guess if one recommended tweet will impact your freelance profit. Now it’s easy to measure how many people your message reached with tweetreach. Enter a word and see the volume of tweet impressions.


     
]]></description>
<dc:subject>profile</dc:subject>
<dc:identifier>https://pinboard.in/u:anu/b:a8f5417d7eef/</dc:identifier>
<taxo:topics><rdf:Bag>	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:profile"/>
</rdf:Bag></taxo:topics>
</item>
<item rdf:about="http://www.tuaw.com/2011/08/11/daily-iphone-app-baby-monkey-going-backwards-on-a-pig/">
    <title>Daily iPhone App: Baby Monkey (going backwards on a pig)</title>
    <dc:date>2011-08-11T13:00:00+00:00</dc:date>
    <link>http://www.tuaw.com/2011/08/11/daily-iphone-app-baby-monkey-going-backwards-on-a-pig/</link>
    <dc:creator>anu</dc:creator><description><![CDATA[



There's two ways to do this. I could tell you that Baby Monkey is a terrific running game, with a really fun double-jump mechanic, bright and colorful graphics, and the catchiest theme song I've heard all year (the game itself is based on Parry Gripp's song). I could say that it's got full Game Center integration, and is available in the App Store for just 99 cents right now. And I could tell you that it's a must-buy title with lots of fun and replay value.


Or, I could just tell you that it's got a baby monkey that rides backwards on a pig. Either way, you should be on your way to the App Store to pick it up right now.
Daily iPhone App: Baby Monkey (going backwards on a pig) originally appeared on TUAW - The Unofficial Apple Weblog on Thu, 11 Aug 2011 08:00:00 EST.  Please see our terms for use of feeds.
Source | Permalink | Email this | Comments]]></description>
<dc:subject>iOS iPhone</dc:subject>
<dc:identifier>https://pinboard.in/u:anu/b:3641fde2ba24/</dc:identifier>
<taxo:topics><rdf:Bag>	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:iOS"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:iPhone"/>
</rdf:Bag></taxo:topics>
</item>
<item rdf:about="http://tobolds.blogspot.com/2011/08/raid-documentary.html">
    <title>The Raid documentary</title>
    <dc:date>2011-08-11T09:20:00+00:00</dc:date>
    <link>http://tobolds.blogspot.com/2011/08/raid-documentary.html</link>
    <dc:creator>anu</dc:creator><description><![CDATA[If you get a chance to watch the documentary The Raid, I can recommend watching it. It is not always pleasant, but realistic enough, and touches a lot of the issues and misconceptions about raiding. Also gives you the opportunity to watch a complete Icecrown raid, in case you never did one yourself.

What struck me most about film was how much it made raiding look like work. You have to be there at a specific time for a specific amount of hours, and you have to perform well during that time. Sounds a lot like my job. 

What the film failed to show was how the guild involved got their raid team together, and who got excluded. No interviews with guild members who didn't get a raid spot or got kicked from the guild, although those undoubtedly exist. Succeeding involves synchronous excellence of execution, and that ends up being both the biggest strength and the biggest weakness of the system: Winning together leads to a strong team spirit to develop (shown in the film), but losing together risks people pointing fingers at whoever they perceive to have been the weak spot.

Real-world groups of friends often include people who aren't quite as bright or successful than the others. Raiding makes that difficult for groups of friends in virtual worlds. Selecting your friends by their gearscore and raid performance gives you greater virtual rewards than selecting them based on how nice they or, or sticking with them through thick and thin out of loyalty. I still hope that we will get some mainstream MMORPG one day which is about people working together without penalizing players for sticking with their under-performing friends. I think that would lead to greater social cohesion than the raid system.Tobold's MMORPG Blog]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:12ebf8bb2379/</dc:identifier>
</item>
<item rdf:about="http://www.lindapeng.com/2011/08/05/10-lessons-i-learned-from-designing-an-online-community-using-wordpress-and-buddypress/">
    <title>10 Lessons Learned From Designing An Online Community</title>
    <dc:date>2011-08-08T12:35:31+00:00</dc:date>
    <link>http://www.lindapeng.com/2011/08/05/10-lessons-i-learned-from-designing-an-online-community-using-wordpress-and-buddypress/</link>
    <dc:creator>anu</dc:creator><description><![CDATA[Comments]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:154a3e360ab3/</dc:identifier>
</item>
<item rdf:about="http://infovore.org/archives/2011/08/06/links-for-august-6th-4/">
    <title>Links for August 6th</title>
    <dc:date>2011-08-06T15:00:41+00:00</dc:date>
    <link>http://infovore.org/archives/2011/08/06/links-for-august-6th-4/</link>
    <dc:creator>anu</dc:creator><description><![CDATA[

Screeny
"The Simplest Screen Recording App For Your Mac. Ever." Looks it. I'm fed up of wrangling things like iShowU, so I might investigate this.
(tags: screencast osx mac app )

]]></description>
<dc:subject>delicious app mac osx screencast</dc:subject>
<dc:identifier>https://pinboard.in/u:anu/b:ff843c06c08c/</dc:identifier>
<taxo:topics><rdf:Bag>	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:delicious"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:app"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:mac"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:osx"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:screencast"/>
</rdf:Bag></taxo:topics>
</item>
<item rdf:about="http://www.marco.org/2011/08/04/puerto-rico-hd-ipad-board-game-review">
    <title>Review: Puerto Rico HD for iPad</title>
    <dc:date>2011-08-04T06:10:15+00:00</dc:date>
    <link>http://www.marco.org/2011/08/04/puerto-rico-hd-ipad-board-game-review</link>
    <dc:creator>anu</dc:creator><description><![CDATA[I’m a huge fan of the Puerto Rico board game: it’s one of the best-known (and one of the best) European-style board games, a category finally becoming popular in the United States with the success of Settlers of Catan.


Unlike most games popular in the U.S., this genre is known for relying much more on strategy and less on luck. Settlers of Catan is actually more of a hybrid in this way: I’d say it relies on luck about as much as Monopoly does, in that even a great strategy can be sunk from a streak of bad luck with the dice.


Puerto Rico is almost pure strategy, with only two relatively inconsequential random elements — the plantation tiles available in each Settler phase, and the initial play order (who goes first) — and the game effectively minimizes and balances the impact of these. It’s no surprise, then, that it dominated BoardGameGeek’s top-ranked list for most of the last decade.


It requires at least three people to play, so a geeky board-game couple like us can only play it as often as we can convince someone to come over and learn it. Everyone we’ve taught to play1 loves the game, including non-geek friends, parents, and siblings, but there are a lot of pieces and a lot of rules. It’s of similar complexity as Settlers of Catan and is therefore best taught virally: you play with someone who knows it and explains it as you go. That’s how I learned (thanks, Andrew!), and I can’t imagine three people sitting down and trying to figure it out from scratch.


As soon as I learned that there was an upcoming Puerto Rico iPad game, I was thrilled: I could finally play this awesome game more often than the twice a year or so that I could convince enough people to play. Plus, the iPad is an excellent board-game platform, so why not port an excellent board game?


I’ve been testing an advance copy of Puerto Rico HD this week, and it’s now available in the App Store. In short: Fans of the board game are going to love this.



Click for big. Or see later in the game.


The board game’s assortment of cards and tiny pieces makes for a huge interface challenge. While there are some small things I would have done differently, Codito Development did a pretty good job with this. It’s clear that they really care about doing the game justice: it’s nothing like the half-assed licensed ports that we usually see from well-known board-game brands.


I was worried that such a complex game wouldn’t have a very good AI, but this AI is excellent. I win regularly against the Medium opponents, but the Hard AI players beat me often. It’s the perfect balance of AI skill without making the game too easy or frustratingly difficult. Single-player is therefore very satisfying, and I can play a speedy game in about 15 spare minutes.


I didn’t have a chance to try the online multiplayer via Game Center, but while it doesn’t support asynchronous turn-based play with multiple simultaneous running games (like Words With Friends), the developer has hinted that it might get this feature in the future.


Tiff and I did play some hot-seat games (both of us taking turns in front of one iPad), and it works extremely well, with the ability to mix any number of human and AI players.


A nice little trick makes hot-seat play exceptional: in the player setup screen, you can tell it which side of the iPad each player is sitting on, and it automatically rotates the interface to face each player on their turn. (Only the two landscape orientations are supported.) That way, if you’re sitting at a table, you can lay the iPad flat in the middle and play comfortably without rotating it constantly. And you can comfortably watch your wife decimate you by buying a wharf and a harbor and shipping out incredible quantities of corn.


Playing the physical board game is an hour of tangible fun with friends or family; playing the iPad game is 15 minutes of amusement with any number of friends (including zero), no setup, and no cleanup. Neither replaces the other. One of the best uses for the iPad game is improving your skills and discovering new strategies to make your real-world gameplay more interesting.


I love that this game is finally available for iPad and we now have that choice.


My only hesitation is that I don’t think I could recommend the iPad edition to people unfamiliar with the board game. Maybe it’s just me2, but I don’t think this would be an easy game to figure out on your own in an app, through no fault of Codito or Ravensburger. The game does have a built-in tutorial, strategy suggestions, and complete instructions, though, so I’m curious: if you’re able to figure out how to play from the app with no previous experience with the board game, please let me know.


If you’re familiar with the board game, or you’re confident that you could learn it from the app, get it from the App Store now. It’s a great, solid iPad adaptation of the best board game I’ve ever played.







It’s always a bit uncomfortable teaching new players about taking these brown “colonists” off the boat and putting them to work on our tobacco plantations without paying them so we can ship crops to the mainland.


(Settlers of Catan isn’t much better. What’s the only black piece in the game?) ↩




I still can’t figure out Carcassonne from its widely-praised iOS app alone. I just don’t have the patience to learn a complex board game from its computerized version. ↩




]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:4495ad08c279/</dc:identifier>
</item>
<item rdf:about="http://www.litkicks.com/AMemoirInProgress">
    <title>A Dot-Com Memoir</title>
    <dc:date>2011-08-03T01:51:47+00:00</dc:date>
    <link>http://www.litkicks.com/AMemoirInProgress</link>
    <dc:creator>anu</dc:creator><description><![CDATA[Levi Asher's story of riding the dot-com boom and bust at Pathfinder and iVillage  ]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:7909da43c665/</dc:identifier>
</item>
<item rdf:about="http://www.tuaw.com/2011/08/02/iomega-mac-companion-hard-drive-big-storage-high-powered-charg/">
    <title>Iomega Mac Companion Hard Drive: Big storage, high-powered charging ports</title>
    <dc:date>2011-08-02T14:00:00+00:00</dc:date>
    <link>http://www.tuaw.com/2011/08/02/iomega-mac-companion-hard-drive-big-storage-high-powered-charg/</link>
    <dc:creator>anu</dc:creator><description><![CDATA[



Iomega has just introduced the new Mac Companion Hard Drive, a 2 or 3 TB external drive that not only offers a lot of storage in a nice-looking container, but also provides a high-powered USB port to charge up your iPad.


The Mac Companion is priced a bit higher than high-capacity USB external drives, with the 2 TB model weighing in at US$195.00 and the 3 TB model at $295.00. However, the manufacturer's suggested retail price is right in line with many other FireWire 800 drives, and the Mac Companion can connect through FireWire 800 as well as USB 2.0.


The Mac Companion also fills the job of a hub. It not only has a 2.1 Amp USB charging port for your iPad, but two more USB ports in a built-in hub and two FireWire 800 ports. Iomega provides cables to get your Mac and the Mac Companion working together off the bat -- one FireWire 800 cable, one conversion FireWire 400-800 cable, and one USB 2.0 cable.


When placed near just about any modern Mac, the Mac Companion fits right in. The aluminum case has four LEDs on the front to let you know how much free space you have left on the drive. Iomega provides software to enable scheduled file-level backups, although most Mac users will want to use the Mac Companion with Time Machine. Iomega also provides a free 2 GB online backup through MozyHome for extra assurance.


TUAW is hoping to get one of the Mac Companion Hard Drives for a full review, so stay tuned for more details.



Iomega Mac Companion Hard Drive: Big storage, high-powered charging ports originally appeared on TUAW - The Unofficial Apple Weblog on Tue, 02 Aug 2011 09:00:00 EST.  Please see our terms for use of feeds.
Source | Permalink | Email this | Comments]]></description>
<dc:subject>accessories HardDrive Mac</dc:subject>
<dc:identifier>https://pinboard.in/u:anu/b:5c87b69a9b9d/</dc:identifier>
<taxo:topics><rdf:Bag>	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:accessories"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:HardDrive"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:Mac"/>
</rdf:Bag></taxo:topics>
</item>
<item rdf:about="https://github.com/alfie/MySQL--Replication">
    <title>MySQL--Replication - Peer-to-peer based, multi-master replication for MySQL</title>
    <dc:date>2011-08-02T11:57:31+00:00</dc:date>
    <link>https://github.com/alfie/MySQL--Replication</link>
    <dc:creator>anu</dc:creator><description><![CDATA[Comments]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:5227c8848bed/</dc:identifier>
</item>
<item rdf:about="http://blog.programmableweb.com/2011/08/01/need-an-out-use-the-fake-call-api/">
    <title>Need An Out? Use the Fake Call API</title>
    <dc:date>2011-08-01T17:00:48+00:00</dc:date>
    <link>http://blog.programmableweb.com/2011/08/01/need-an-out-use-the-fake-call-api/</link>
    <dc:creator>anu</dc:creator><description><![CDATA[We all sometimes end up in situations that we’d rather not be in. From annoying coworkers to bad blind dates, sometimes a way out can be rather convenient. As technology advances, new ways of getting out of such situations are often showing up. One of these is the Fake Call API, designed to send phone calls to your phone via a web API call.

It works like this: you make an API call to set up verification that you do, in fact, own the given phone. You do this as follows, as described by the site:


creating/verifying an account

This will call the number you specify and ask you to verify you have the phone in your possession by entering a 2 digit code. The password is whatever you want it to be, and which you’ll use in the future for Basic Authentication when you need to do any other API calls.

This is also how you change your password if you’ve forgotten it.


  PUT http://api.fakecall.net/v1/account/(your number)
  password=your%20password%20here


Creates an account for 123-456-7890 with password “your password here”, which number and password will be used for HTTP Basic Auth for all other API calls in the future:


  curl –request PUT –data “password=your password here” \

http://api.fakecall.net/v1/account/1234567890



After doing that, you can make API calls to authorize other accounts with their own verified phone numbers to make calls to your number through the service as well, so you can allow friends to use the API to rescue you. You can get a list of those authorized to call you, delete your account, or make a call to yourself, using the password you set up.

At the moment, the service does not have its own SSL certificate, though you can use HTTPS with a warning. Due to the service’s nature, you are handing your phone number to the owner of the API, so it isn’t the most secure of services. It is free, however, and rather neat. In addition to being an API, it’s also a mashup, built on the Twilio Voice API.

One could easily use the Fake Call API to execute code at a specific time, such as cron, to give yourself an out during a blind date, family function, party, or anything you might like an out for. Making a mobile client for this could also work well, either to use for yourself or for a friend using the authorization trick. All in all, it’s a simple solution to an age-old problem, and you can’t beat the price, or the ease of implementation.

Sponsored by

Related ProgrammableWeb Resources Fake Call API Profile


 
]]></description>
<dc:subject>APIs fun</dc:subject>
<dc:identifier>https://pinboard.in/u:anu/b:c4fba717fe05/</dc:identifier>
<taxo:topics><rdf:Bag>	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:APIs"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:fun"/>
</rdf:Bag></taxo:topics>
</item>
<item rdf:about="http://blog.edouardswiac.net/2011/07/31/hacking-like-a-hacker-on-a-mac.html">
    <title>Hacking like a hacker on a Mac using iTerm2, tmux, emacs, irssi (and more).</title>
    <dc:date>2011-08-01T08:38:09+00:00</dc:date>
    <link>http://blog.edouardswiac.net/2011/07/31/hacking-like-a-hacker-on-a-mac.html</link>
    <dc:creator>anu</dc:creator><description><![CDATA[Comments]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:387145856b6b/</dc:identifier>
</item>
<item rdf:about="http://www.oreillynet.com/ruby/blog/2006/03/interviewing_ruby_programmers.html">
    <title>Interviewing Ruby Programmers</title>
    <dc:date>2011-08-01T08:37:59+00:00</dc:date>
    <link>http://www.oreillynet.com/ruby/blog/2006/03/interviewing_ruby_programmers.html</link>
    <dc:creator>anu</dc:creator><description><![CDATA[Comments]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:a601bec3cfbc/</dc:identifier>
</item>
<item rdf:about="http://www.pbs.org/idealab/2011/07/the-frightening-real-world-strength-of-channel-4s-sweatshop-game207.html">
    <title>The Frightening, Real-World Strength of Channel 4's 'Sweatshop' Game</title>
    <dc:date>2011-07-27T15:16:14+00:00</dc:date>
    <link>http://www.pbs.org/idealab/2011/07/the-frightening-real-world-strength-of-channel-4s-sweatshop-game207.html</link>
    <dc:creator>anu</dc:creator><description><![CDATA[


Sweatshop is a new browser game, developed by Littleloud for Channel 4 Education, in which players fill the role of a factory floor manager in a developing nation. Taking design cues from the tower defense genre, the game tasks you with placing skilled workers and child laborers along a conveyor belt. It's also one of the most compelling and effective political games I've seen in recent years.


Orders for different kinds of garments -- including hats, shirts, bags and shoes -- come down the line, and laborers assemble these products at varying speeds according to their specialty (or lack thereof, in the case of the children). For each completed garment, the player receives a small amount of cash that is then reinvested into hiring more workers or purchasing support items such as water coolers, fans and portable toilets. Some support items increase the speed or profitability of workers within their zone of effect, while others are required to prevent their inevitable exhaustion and (later in the game) bodily harm.


Over the course of 30 stages, players are scored on the efficiency and, ultimately, character of their management decisions. This is reinforced by a trophy system, a karma meter, and a version of the classic shoulder angel/devil duo: a pitiable Child working in the factory and the comically inhumane Boss. 


The Child, who is always placed on the line for free at the beginning of each stage, explains how new support items can be used to help keep workers safe. In between stages, the Child presents brief factoids on sweatshop labor around the world. The Boss harangues players at the beginning and end of each work day, only taking a break from shouting and spewing his bad-taste humor to take phone calls from the pompous fashion industry moguls who send in orders.


A full-featured political game

Littleloud and Channel 4 previously worked together on Bow Street Runner and last year's The Curfew. The latter was essentially an interactive drama that depicts the dangers of a potential future police state in the U.K., written by comics author (and game journalism alumnus) Kieron Gillen. Because The Curfew only featured mini-games tangentially related to its full-motion video acting, I didn't know what (or how much) to expect from Sweatshop. What I found was one of the most subtle and full-featured political games that I've come across in the past few years. 





For American readers who aren't exactly sure how Channel 4 works, it is a state-owned broadcaster established in the United Kingdom (UPDATE: corrected misunderstanding that it was the "fourth" UK state-owned broadcaster). Channel 4 commissions all of its programming from external companies, meaning its content has often been eclectic and cutting-edge, and over the years it has established the "4" brand as a significant name in culture and entertainment. Channel 4 Education, the department that published Sweatshop, is primarily tasked with providing entertaining pedagogical content to U.K. teenagers. Each year, C4E picks themes especially relevant to contemporary teens and invites indie games developers from around the United Kingdom to a pitch session. 


"Sweatshop was Littleloud's pitch for a game about the fashion industry, one of the key topics suggested by the broadcaster for its 2011 slate," said Simon Parkin, the game's designer, writer, and producer. "As young people generally have limited disposable income, they are likely to buy cheap, fashionable clothes from high street retailers who drive down their prices by employing sweatshop labor."


During the first five to ten levels of the game, play isn't particularly difficult enough to raise any obvious alarms about the unfair labor practices that become necessary evils in sweatshop economics. As Parkin explained, "There's no leap of abstraction to view workers as 'towers' working on targets when they enter their 'area of effect.'" (In fact, the pairing of theme and play here is so strong that you might not even notice that it's a tower defense game at first.) 





But that isn't the extent of the game's argument. For this early phase of Sweatshop, the factoid text bubbles at the score screen deliver most of the crucial information about sweatshop practices. If the game stopped here, it would be comparable to PETA's Mama Kills Animals; the latter doesn't actually encapsulate its social message about the inhumanity of factory farming in play itself, relying on external links and short documentary clips. 


Increasingly complex 

But Sweatshop is a game that, in accordance with the genre conventions of tower defense, becomes gradually more and more complex to control over time. As its play deepens, so too does its procedural rhetoric. 


The first thing players will notice is that, in order to attain gold medals on each stage, they must almost constantly run the conveyor belt at double speed. At this pace, it becomes increasingly difficult to keep on top of worker fatigue and a proper mix of skilled labor for each type of garment. 


My first "a-ha" moment came when I realized that I could nab a gold medal on many levels -- and minimize the amount of clicking and thinking I needed to do -- simply by covering the belt in child labor, rather than planning for and maintaining a large force of skilled workers. These workers are cheap and replaceable, meaning they also contribute to build speed and a high "money saved" score at the end of a level.


Of course, you'll still end up scoring closer to 100 percent if you replay a level many times to figure out the ideal build order for skilled workers. But why would you, if you can attain a satisfactory score with so much less effort? 


The next layer of the game's rhetoric unfolds more slowly. The fact is that you can't really convey the extent of the hardships faced during a long, underpaying shift on a factory line in any medium. (You could craft a time-accurate simulation, but it would be difficult to rope many into playing it.) Instead, Sweatshop's strategy is to pull you into the antagonist's mindset; it forces you into the cold logic of sweatshop management and leaves you to reflect on your own descent into it. In the design of Sweatshop, Parkin and the others at Littleloud struck upon what Ian Bogost calls "tight coupling." According to Parkin:


It was one of those rare cases where the mechanics and the message seemed to align neatly, and once we began speaking to experts in the field of sweatshop labor it became clear that there was a huge amount of relevant content that we could bake into the game mechanics.


Baking in real-world content

Essentially, the game begins as a cartoon sketch of factory labor. You don't need to worry about worker fatigue, safety and morale. But Littleloud gradually "bakes in" more and more of this real-world content. By the end, you need to keep the floor stocked with water coolers, repairmen and fire marshals to keep your workforce alive. 


And then, if you're taking the game seriously, you really start to hold it against them. You cut corners, gambling on the low odds that one or two workers outside the repairman's safety zone might harm themselves. Instead of blaming yourself for demanding too much from them, or for not planning ahead in your support item infrastructure, you get angry at your sim-workers for getting tired at the most inopportune times. It is this reduction of human beings to numbers, pesky weak flesh in the way of the profit, that is Sweatshop's frightening strength.





Of course, not everything about Sweatshop works as well as it could. For instance: radios, fans and portable toilets all contribute in some way to worker productivity. While we can certainly see the case for radios increasing morale and fans reducing fatigue, one of the game's factoid texts explicitly critiques many sweatshops for not allowing workers to use the restroom in order to maximize productivity. The support items are so helpful that, at the end of any given level, your floor is likely to look a lot more hospitable than most actual sweatshops would be. 


But incongruities such as this are only a minor problem. The biggest obstacle I see is that, because it is so full-featured and modeled after commercially viable tower defense games, Sweatshop's rhetoric burns so slowly that many players might never encounter it. Even if you play to the end, it really requires a desire to attain gold medals on your part for much of its skillful mental manipulation to take effect.


That said, Sweatshop's many animated cut scenes and factual texts will arguably hit harder for the intended teenage audience than they did with me. There's not as much of a direct causal link between the game and the practice of buying cheap clothes (the stated target of the project) as one might like, but it's a huge step in the right direction for Littleloud as a studio. 


Although Parkin couldn't provide details on the game's budget, he did offer a timetable for the game's production. It was pitched to Channel 4 last summer, but it didn't enter production until January. The development cycle lasted around six months with a small team of four, though other members of the studio provided ongoing support. These rough numbers attest to the thoroughness and determination of both Littleloud and Channel 4, showing what can be done when one waits until a game is fully realized before pushing it to press.
]]></description>
<dc:subject>Education game</dc:subject>
<dc:identifier>https://pinboard.in/u:anu/b:0ab3dc3b5a4f/</dc:identifier>
<taxo:topics><rdf:Bag>	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:Education"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:game"/>
</rdf:Bag></taxo:topics>
</item>
<item rdf:about="http://daringfireball.net/2011/07/succeeding_steve_jobs">
    <title>★ On Succeeding Steve Jobs</title>
    <dc:date>2011-07-22T22:29:16+00:00</dc:date>
    <link>http://daringfireball.net/2011/07/succeeding_steve_jobs</link>
    <dc:creator>anu</dc:creator><description><![CDATA[On Wednesday, less than 30 minutes before Apple announced another record-breaking quarter of financial results, the Wall Street Journal published a story by Yukari Iwatani Kane, Joann S. Lublin, and Nick Wingfield regarding the issue of Apple CEO succession. (You can circumvent the WSJ paywall using this link, which allows access to anyone coming to the story from Google.)


Here’s the nut of it:



  Since Steve Jobs went on medical leave this winter, some members
of Apple Inc.’s board have discussed CEO succession with
executive recruiters and at least one head of a high-profile
technology company, according to people familiar with the matter.


The conversations weren’t explicitly aimed at recruiting a new
chief executive and were more of an informal exploration of the
company’s options, said these people. The directors don’t
appear to have been acting on behalf of the full board, some of
these people said. Apple has seven directors, including Mr. Jobs.


It is also unclear whether Mr. Jobs was aware. In response to
questions from The Wall Street Journal about the discussions, Mr.
Jobs said Monday in an email, “I think it’s hogwash.”



As I wrote when the story broke, to say that the timing of the publication was suspicious is an understatement. Everyone knows the question of succeeding Jobs is attached to dynamite. He cannot be replaced, but, inevitably, someday will be. If Jobs steps down as CEO at any point in the foreseeable future, the company’s stock price is almost certain to take some sort of hit. I can’t see how a speculative and sketchily-sourced story such as this, published 30 minutes before Apple announced overwhelmingly positive financial results, was not intended to dampen, to some degree, the positive effect of those results on Apple’s stock.


Regarding my description of the story as “sketchily-sourced”: the only attribution in the story is “according to people familiar with the matter”. That could be anyone. A good source would be one or more of the purportedly rogue board members. A dubious source would be, say, simply an executive headhunter who claims to have been approached by members of the Apple board, or the “head of a high-profile technology company” — i.e. perhaps an Apple competitor. I find it hard to believe any member of Apple’s board would speak about such an effort to reporters. There are no names in the story whatsoever. No board member, no headhunter, no supposedly-considered outside candidates for the job. None.


The more I think about this story, the worse it looks. Here’s what gives credence to Jobs’s dismissal of it as “hogwash”: there is no one from outside Apple who could credibly replace Jobs as CEO of Apple. If Jobs steps down in the foreseeable future, his replacement will come from within the company.


A new Apple CEO would need credibility and the ability to instantly instill confidence with two highly disparate groups: Apple’s rank-and-file employees, and Wall Street. The only candidates who could satisfy both factions, to any degree, already work at Apple. Name one outsider who’d be accepted both inside the company and on Wall Street. I can’t. Not one.


Apple employees respect and cultivate great design above all else. No other company in technology reflects this ethos. There is no other company like Apple. An exodus of talent from the company would be utterly devastating. Everyone on Apple’s board of directors must know this. It’s completely obvious.


Names I’ve seen bandied about as potential outside successors:



Eric Schmidt. Zero chance. Schmidt is viewed throughout Apple as a traitor, who perhaps used his knowledge of the iPhone, gleaned while then a member of Apple’s board himself, to give Google’s Android effort a leg up. There is a better chance of Apple choosing its next CEO through a raffle of ten golden tickets hidden inside iPad boxes distributed around the globe than that they’d give the job to Eric Schmidt. Wall Street might accept him but Apple rank-and-file would revolt.

Anyone else from Google. No credibility within Apple regarding design, no experience with hardware products.

Jon Rubinstein. Rubinstein left Apple in March 2006. He did good work at Palm as CEO — their WebOS products are far better than the junk they were making when he joined. But why would Apple hire back as CEO someone who left the company a year before the iPhone and whose post-Apple track record is producing failed iPhone competitors? How could Apple pass over the executives who’ve helped create the iPhone, iPad, iOS, and the App Store for someone who wasn’t there for any of it? I still hope Rubinstein and HP pull it out, and I think they can. But the bottom line is that Rubinstein is now a competitor.

Tony Fadell. Nope.

Jeff Bezos. The best answer I’ve seen, but I can’t imagine him wanting to leave Amazon for any other company. Amazon is shaped in Bezos’s image. And Amazon — although a company I think most Apple folk greatly respect and frequently patronize — doesn’t exactly have a reputation for producing Apple-caliber user interfaces or hardware.

Larry Ellison. Same as Bezos. Not going to leave the successful company he founded and built; no record of producing Apple-caliber design.

Anyone from Microsoft. No credibility, period. The one and only reason I can think of to even consider hiring from outside Apple would be to get someone who already holds or has held the title “CEO”. Gates or Ballmer at Apple? Come on.

Woz. Beloved within Apple, but he’s been out of the game for decades, and, let’s face it, is a bit of a flake.

Jean-Louis Gassée. A smart guy, and he gets how Apple works and understands great design. But his chance to lead Apple was in 1996, and everyone knows it. How could Apple pass over its own executives who’ve been at the company throughout the past decade for someone they passed over 15 years ago?

Guy Kawasaki. No recent relevance to anything related to Apple. Little credibility among current Apple employees, none on Wall Street.

Jack Dorsey. Square suggests he has an Apple-caliber design eye, but neither of his companies, Twitter nor Square, has made a dollar of profit. Apple generates over $500 million in profits per week. Dorsey may well be the industry’s next Steve Jobs, but he can’t be the next Apple CEO.



The Only Credible Candidates

Everyone wants this to be an interesting story, but it’s not. There is no intrigue. If Jobs steps down in the foreseeable future his replacement will almost certainly be Tim Cook. Utter credibility on Wall Street, and much respect within Apple. He’s already run the company while Jobs has been on leave. The knock against him is that he’s an operations and finance guy, not a product design guy. Ideally Apple would find someone just like Steve Jobs, but there exists no such person. There will not be a next Steve Jobs. There will be a next CEO.


Read what Tim Cook has said about Apple over the past few years. He is anything but a typical operations and finance guy. He’s an operations guy who understands how Apple works and why it has succeeded, and what it needs to keep doing to continue growing. Cook cannot do what Jobs does, but no one else can either. And Cook, I think, is not only aware of that, but he’s comfortable with it. The obvious structure for a post-Jobs Apple has Cook as CEO, doing mostly what he’s already been doing as COO. What he already does at Apple is what most CEOs do at other companies. Final word on product design goes to the senior vice presidents: Scott Forstall (iOS), Jonathan Ive (hardware design), and Phil Schiller (marketing and, perhaps, Mac).1


Those three men are the only other credible candidates for the job than Cook — and one gets the distinct impression that Ive has no interest in the limelight that would accompany the post. And I don’t see how Forstall or Schiller could be offered the gig unless Cook was on board, satisfied remaining as COO.2 Because if Cook were passed over and in response left Apple, that’s the sort of thing that could trigger a stock collapse on Wall Street.


Things would be different if Apple weren’t both larger and growing faster than all of its competitors. But they are. Apple has different values than its competitors, and everyone in the company believes that it is because of these differences, not despite them, that Apple has achieved its current success. The last thing Apple needs is a shake-up or a dose of what any of their competitors are drinking.


Put another way, the obvious structure for a post-Jobs Apple is simply Apple as we know it, without Steve Jobs.






There is no reason to assume that the next CEO of Apple will also serve as the public spokesman for the company at product introductions and WWDC keynotes. Steve Jobs has served that role not because he’s the CEO but because he’s the best at it. ↩




Cook has so much credibility on Wall Street that effectively, the board might have to offer him the job. Perhaps this entire article could be replaced with, “Look, it’s going to be Tim Cook, and that’s that.” ↩




]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:ffa2561e8cb9/</dc:identifier>
</item>
<item rdf:about="http://tobolds.blogspot.com/2011/07/forum-lies.html">
    <title>The forum lies</title>
    <dc:date>2011-07-22T14:32:00+00:00</dc:date>
    <link>http://tobolds.blogspot.com/2011/07/forum-lies.html</link>
    <dc:creator>anu</dc:creator><description><![CDATA[I finally got around to watching Benjamin Cousins' (EA) excellent but lengthy talk about paying to win. In great detail and with disarming honesty Ben tells the story of how Battlefield Heroes was changed in December 2009 from a Free2Play game with just fluff and convenience items to a "pay to win" game. Weapons for real money were introduced that were better than any weapons you could get by playing, and simultaneously it was made harder to play for free. The users on the forums were extremely upset, and the press echoed the forum posters feelings and declared that EA had ruined Battlefield Heroes.And if we wouldn't have the data Ben revealed in his talk, this is what we might have believed, that EA ruined the game. But the data show something completely different: There was no measurable negative impact on player numbers from all that uproar, both the amount of new players coming in and of old players leaving remained constant. And financially the move was a huge success instantly doubling revenue of the game, and turning it from a game losing money to one making a healthy profit. Which also means turning it from a game threatened with closure to a game that will stick around.Further data analysys showed that the forum posters only represented 2% of the player base, that they spend 10 times more money on the game than the average user, and that they lied when they said they'd quit over this move. Ben even shows some hate mail he got, where he tracked the players and found that in spite of the hate, the players spent more on the game after the change. Thus when the CEO of CCP recently commented the uproar of the EVE community on a similar issue with "I can tell you that this is one of the moments where we look at what our players do and less of what they say", he was completely right. The forum lies.This goes beyond Anil Dash's insight that if your website's full of assholes, it's your fault, suggesting stronger forum moderation. It tells you that people posting on forums are passionate about their game to such a extreme, that what they are saying is actually not relevant any more. There is no connection between the outcry of the 2% of forum posters, and what the other 98% think. There isn't even a connection between what the 2% say and what they themselves do. Trying to get useful information about a game from a forum poster is like trying to get an overview of how some modern religion is from its most crazy religious nutters. The forum lies, and is not be taken seriously as a source.And of course the same applies to blogs. Doubly, because bloggers aren't representative of the player base, and the commenters on a blog are neither representative of the players, nor even of the readers of that blog. Most simple statements you can read on a blog or its comment section, like this or that feature or this or that game "sucking", are completely irrelevant. The more visibly angry the poster is, the more likely it is that his rant isn't representative of anything except his own anger. Which might not even be related to the game he is ranting about. Where blogs beat forums on the other hand, is that on a blog you are more likely to find actual rational arguments for a point of view, or original thoughts. Even in the comments section sometimes. Maybe the opinion is not representative, but if somebody manages to pull of constructive criticism (a rarity on the internet), this can be a source for ideas on how to improve a game. But to know whether something works or doesn't work, you still have to try it out and watch what your players actually do, and how their behavior actually changes in response to the changes to the game.Tobold's MMORPG Blog]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:40f20dff3a07/</dc:identifier>
</item>
<item rdf:about="http://www.roughtype.com/archives/2011/07/news_in_the_net.php">
    <title>News in the net age: sources</title>
    <dc:date>2011-07-21T19:03:59+00:00</dc:date>
    <link>http://www.roughtype.com/archives/2011/07/news_in_the_net.php</link>
    <dc:creator>anu</dc:creator><description><![CDATA[In the course of preparing my statements for the Economist journalism debate, I reviewed a bunch of recent, useful studies and surveys. It took a while to dig these up, so I thought I'd provide a list here (in no particular order) in case anybody needs it in the future.


Federal Communications Commission, The Information Needs of Communities (2011)


Congressional Research Service, The U.S. Newspaper Industry in Transition (2010)


Knight Commission on the Information Needs of Communities in a Democracy, Informing Communities (2010) and Re-imagining Journalism (2011)


Media Standards Trust, Shrinking World: The decline of international reporting in the British press (2010)


American Journalism Review, Statehouse Exodus (2009) and Abandoned Agencies (2010) and Retreating from the World (2011)


Columbia Journalism Review, The Reconstruction of American Journalism (2009)


The Guardian, Stop Press (UK regional journalism survey) (2009)


Global Journalist, Is the Foreign News Bureau Part of the Past? (2010)


Human Rights Watch, Whose News? (2011)


Pew Research Center's Project for Excellence in Journalism offers many studies, including its annual State of the News Media reports and News Leaders and the Future (2010)
]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:94ca9e6c74a5/</dc:identifier>
</item>
<item rdf:about="http://theme.it/an-alternative-to-the-shortcode-madness-part-1/">
    <title>An Alternative to the Shortcode Madness [Part 1]</title>
    <dc:date>2011-07-21T16:42:15+00:00</dc:date>
    <link>http://theme.it/an-alternative-to-the-shortcode-madness-part-1/</link>
    <dc:creator>anu</dc:creator><description><![CDATA[I tend to spend a good amount of my time continuing to learn WordPress and improve the ways I go about coding themes. With the vast majority of my WordPress development being done for clients, it is important to me to keep a good relationship with them. I feel part of maintaining that relationship is to provide a seamless, simple, and easy solution to their website project. I refer to this as the “Don’t make me think” approach, which pairs nicely with “Just because you can, doesn’t mean you should”…

In most cases, clients spend most of their time adding/editing content in the editor. It is then important to keep things simple yet provide as much functionality as possible. If your clients or users are anything like mine, more than likely they don’t spend the vast majority of their time cleaning code in their favorite text editor and are probably not catching up on their RSS feed full of their favorite web related sites just before they go to bed at 2 am like the rest of us. Clients also get confused when they hear “It’s as simple as adding a class to the element” when trying to create the desired green glossy web 2.0 button. Usually this will lead you to a variety of blank stares as their idea of a class and elements is a room of kids and the periodic table.

Basically, for me to expect my clients to know, remember, and filter through the HTML to add a class to an anchor tag, buried in the middle of the text, is not my idea of a seamless, simple, and easy solution. This goes without mentioning the sometimes bizarre and crazy markup that can be made by the visual editor in the first place (insert previous “cleaning code” remark here ____).

So then, how can the client or user make that link look pretty and green, with rounded corners, a text shadow… and the groovy gradient gloss effect?

SHORTCODES!!! … or simply select the style from a drop down menu within the visual editor.

Implementing A Custom Styles Drop Down Menu
The first alternative up for debate is to provide a custom styles drop down menu. This method is simple to implement for developers and simple to use for users. This is by no means revolutionary as it has been done before, but it is certainly effective. Part of the beauty of adding a new styles drop down into the editor is:


The client does not have to remember a class name, or a shortcode name for that matter… both of which are usually found written down on a yellow post-it-note stuck to the outside edge of their monitor. I have an alternative for this as well that will be covered in another article.
It’s inside the visual editor. No need for the HTML view and code sifting.
It’s a common practice and recognized functionality.
“Don’t make me think” rule applied.

Below is the code necessary to implement a simple styles drop down box.
/** 
 * Filter TinyMCE Buttons
 *
 * Here we are filtering the TinyMCE buttons and adding a button
 * to it. In this case, we are looking to add a style select 
 * box (button) which is referenced as "styleselect". In this 
 * example we are looking to add the select box to the second
 * row of the visual editor, as defined by the number 2 in the
 * mce_buttons_2 hook.
 */
function themeit_mce_buttons_2( $buttons ) {
  array_unshift( $buttons, 'styleselect' );
  return $buttons;
}
add_filter( 'mce_buttons_2', 'themeit_mce_buttons_2' );

/**
 * Add Style Options
 *
 * First we provide available formats for the style format drop down.
 * This should contain a comma separated list of formats that 
 * will be available in the format drop down list.
 *
 * Next, we provide our style options by adding them to an array.
 * Each option requires at least a "title" value. If only a "title"
 * is provided, that title will be used as a divider heading in the
 * styles drop down. This is useful for creating "groups" of options.
 *
 * After the title, we set what type of element it is and how it should
 * be displayed. We can then provide class and style attributes for that
 * element. The example below shows a variety of options.
 *
 * Lastly, we encode the array for use by TinyMCE editor
 *
 * {@link http://tinymce.moxiecode.com/examples/example_24.php }
 */
function themeit_tiny_mce_before_init( $settings ) {
  $settings['theme_advanced_blockformats'] = 'p,a,div,span,h1,h2,h3,h4,h5,h6,tr,';

  $style_formats = array(
      array( 'title' => 'Button',         'inline' => 'span',  'classes' => 'button' ),
      array( 'title' => 'Green Button',   'inline' => 'span',  'classes' => 'button button-green' ),
      array( 'title' => 'Rounded Button', 'inline' => 'span',  'classes' => 'button button-rounded' ),
      
      array( 'title' => 'Other Options' ),
      array( 'title' => '&frac12; Col.',      'block'    => 'div',  'classes' => 'one-half' ),
      array( 'title' => '&frac12; Col. Last', 'block'    => 'div',  'classes' => 'one-half last' ),
      array( 'title' => 'Callout Box',        'block'    => 'div',  'classes' => 'callout-box' ),
      array( 'title' => 'Highlight',          'inline'   => 'span', 'classes' => 'highlight' )
  );

  $settings['style_formats'] = json_encode( $style_formats );
  return $settings;
}
add_filter( 'tiny_mce_before_init', 'themeit_tiny_mce_before_init' );

Now, to apply our green button style to a link, all the user has to do is highlight the links text and select the “Green Button” style from the new drop-down. This link will now take on the simple and universal CSS-based button style set in your themes stylesheet. There is various methods to doing this. Instead of a span tag for the button, you could use an “a” tag. Play around and see what you think.

Take It Another Step Further with Editor Styles
So now we have made things easier for our users to style elements without having to touch any code or add a single shortcode. Let’s take things one step further and add those styles to the visual editor so the users can see the results. To do this, we will simply add a few lines of code to the functions.php and create a new stylesheet for the editor to use.

/**
 * Add Editor Style
 *
 * This provides the theme with the functionality to add a custom
 * TinyMCE editor stylesheet. By default, the add_editor_style() will
 * look for a stylesheet named editor-style.css in your theme. Here
 * we have chosen to define our own stylesheet name, style-editor.css.
 * This stylesheet can be named whatever you want, just be sure it is
 * defined in the function below and included in your theme files.
 *
 *{@link http://codex.wordpress.org/Function_Reference/add_editor_style }
 */
 
function themeit_add_editor_style() {
  add_editor_style( 'style-editor.css' );
}
add_action( 'after_setup_theme', 'themeit_add_editor_style' );

By providing the add_editor_style() function, we are telling WordPress the theme is including a custom TinyMCE editor stylesheet. Now we can include any custom styles the theme may use into a css file called style-editor.css, which we defined in the add_editor_style() function. By default, if a stylesheet name is not defined here, WordPress will look for a file called editor-style.css. I usually change the name to style-editor.css for organizational purposes so the file is listed next to my style.css file. For a great starting point, take look at the Twenty Eleven theme’s editor-style.css file.

Down the Road…
I have a few other, possibly more advanced methods, I would like to share down the road regarding this topic of shortcode alternatives. These methods are a little more robust and allow for more advanced styling to elements. For the sake of an already lengthy article, I’ve decided to split it up into multiple “Parts”. In short, these methods include the use of Quicktags, Advanced TinyMCE Buttons, and “Smart” Editor styles. If your like me and prefer to dig around in code to figure things out on your own, all these methods are currently used in the Debut Theme on Press75.com.

]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:1ab943867005/</dc:identifier>
</item>
<item rdf:about="http://www.marco.org/2011/07/19/siracusa-multipage">
    <title>Saving John Siracusa’s massive Lion review to Instapaper</title>
    <dc:date>2011-07-20T02:06:24+00:00</dc:date>
    <link>http://www.marco.org/2011/07/19/siracusa-multipage</link>
    <dc:creator>anu</dc:creator><description><![CDATA[Tomorrow, Mac OS X Lion will be released. And therefore, tomorrow, John Siracusa’s massive Lion review will likely be published on Ars Technica. Since it’s a long web article, a lot of people are going to save it for reading later with Instapaper.


It’s going to be split into a lot of pages. His previous Snow Leopard review was 23 pages.


Nearly all of Instapaper’s competitors, even including Safari’s built-in Reader feature, offer automatic multi-page fetching and stitching into one long page. To date, I’ve intentionally not offered this feature on Instapaper. I’ll seek out publicly available “single page” links and automatically fetch those instead, but I don’t create a single-page view that doesn’t otherwise exist publicly on a publisher’s site.


I’ve been torn about this for a while, since I’m losing business to competitors because of it. It’s a risky move for me to even talk about it like this. But I feel like multi-page stitching is a tricky line to cross, and for the time being, I don’t feel comfortable crossing it.


Ars Technica sells Premier memberships for $5 per month that include single-page views of articles (among other benefits).


I signed up for a Premier subscription and tested saving the single-page version of the Snow Leopard review with the Instapaper bookmarklet, and it worked great. And if anything unforeseen prevents the single-page Lion review from saving properly, I’ll do my best to tweak it and fix the problem as quickly as possible.


I respect Ars Technica’s choice to keep single-page versions of long articles as a subscriber-only feature. If you want to save John Siracusa’s huge Lion review to Instapaper as one long page tomorrow, please support their business and buy an Ars Premier subscription.
]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:e57e57581c75/</dc:identifier>
</item>
<item rdf:about="http://freelanceswitch.com/product-reviews/open-source-project-management-tools/">
    <title>Top 10 Open Source Project Management Apps for Freelancers</title>
    <dc:date>2011-07-19T14:00:16+00:00</dc:date>
    <link>http://freelanceswitch.com/product-reviews/open-source-project-management-tools/</link>
    <dc:creator>anu</dc:creator><description><![CDATA[

Successful freelancers know that time is money. Efficient task and time management are the key factors for freelancers. One freelancer may simultaneously lead several projects, need to communicate with a dozen of clients, and have numerous deadlines to hit. To turn freelance chaos into prioritized work order, there are many project management tools in the getting things done software market.

However, most project management tools are expensive or don’t meet freelance needs. Let’s face the truth: the majority of freelancers are budget-limited, work in small teams with multiple clients located worldwide, or are scattered all over the country. Thus, freelancers want cheap, ideally free, highly customizable project management solutions for efficient team-working.

Let me introduce 10 free, open source project management products that are likely to fit your freelance requirements:

1. Collabtive
Collabtive

Collabtive is a web-based open source project management suite. A quick look inside shows that Collabtive has all the basic features: milestones, task management, time tracking, calendar. Moreover, you can import Basecamp projects and get RSS updates. Laconic, clean interface can be enriched by paid plugins provided by the vendor.



2. GanttProject
GanttProject

GanttProject is a free cross-platform project management tool. If you are a Gantt chart addict, than give a try to GanttProject. You can set milestones, plan resources, measure results, make reports and share projects.

3. phpCollab
phpCollab

phpCollab is a customizable open source team-working solution. You can manage projects, set tasks, view milestones. Launched in 2002, phpCollab stands out for sufficient online collaboration tools such as discussions, notifications, support requests.

4. phpEasyProject
phpEasyProject

phpEasyProject is invented for small teams. Though the interface is incredibly simple and clean, all the basic collaboration features are packed. You can create projects, set up tasks and manage to-do list. Dotproject includes a report export feature and performance statistics. So you can keep track of all current team activity.

5. Project.net
Project.net

Project.net describes itself as enterprise-level project management software with open code. You can manage projects, collaborate, and use social sharing tools within your team. To tack projects easier, try project templates and dashboards. Besides, Project.net offers paid services like training or top-priority support so you can migrate to the new project management system smoothly.

6. ]project-open[
project-open

]project-open[ is more than just a project management suite. It claims to cover related business areas like CRM, invoicing and payments. Standing close to ERP software, ]project-open[ performs all basic project management tasks. You can manage projects, assign tasks, generate reports and track overall results.

7. Redmine
Redmine

Redmine is a flexible web-platform for project management. Redmine is based on Ruby on Rails framework and has multiple database support: Postgre SQL, SQLite and MySQL. The application is multilingual and available in more than 30 languages. Redmine provides users with Gantt chart, calendar, time tracking features which are essential for project planning.

8. TaskJuggler
TaskJuggler

TaskJuggler is project management software for serious project managers as it’s written on the website. No matter how serious you are, TaskHuggler will help you to manage tasks, project files, analyze project performance. The data is presented in dashboards and charts so you can have all info at your hand.

9. Teamlab
Teamlab

Full Disclosure: I work on Teamlab.

Teamlab is a A-grade free project management software. It has 4 modules: project management, business collaboration, documents processing and instant messaging. You can set tasks, milestones, track project activity and generate reports, share bookmarks and wiki pages with your colleagues, keep your teammates up to date with news and even create a poll. Teamlab has a fully featured document management suite. Users can edit, store and share documents right on the corporate portal. Thus you can get rid of Google Docs or Dropbox/Box.net file uploads.

10. WebCollab
WebCollab

WebCollab is online collaboration platform suitable for freelancers. You can make to-do lists, manage tasks via calendar, and manage projects. WeCollab supports social activity. You can post messages in forums or add new contacts or files for further team work.


     
]]></description>
<dc:subject>project_management</dc:subject>
<dc:identifier>https://pinboard.in/u:anu/b:52d8de468b8a/</dc:identifier>
<taxo:topics><rdf:Bag>	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:project_management"/>
</rdf:Bag></taxo:topics>
</item>
<item rdf:about="http://www.smashingmagazine.com/2011/07/19/create-an-html-and-css-mobile-web-app-using-sencha-touch-2/">
    <title>Create An HTML/CSS Mobile Web App Using Sencha Touch</title>
    <dc:date>2011-07-19T10:34:48+00:00</dc:date>
    <link>http://www.smashingmagazine.com/2011/07/19/create-an-html-and-css-mobile-web-app-using-sencha-touch-2/</link>
    <dc:creator>anu</dc:creator><description><![CDATA[



      
        
    



The world of mobile app development is quickly becoming a crowded and complicated space, especially for those outside of the development niche.

“Which development platform should I use?” “Do I go native or Web-based?” “Which devices should I plan for?” “Can I build my mobile website by hand or should I use a pre-built package?”

The questions are endless.

As a designer, my job is to help my clients answer these questions. I try to stay in the category of “knowing enough to be dangerous,” and I keep tabs on the latest mobile development trends, one being the growing popularity of mobile Web apps.

What Is A Mobile Web App?
A mobile Web app is an app that you access via a mobile browser (such as iPhone’s Safari). It is not a static mobile website. It is designed to work like a native app, but it is not accessible via the App Store or Android Marketplace. You pull it up right from the browser.

Why Create a Mobile Web App Instead of a Native App?
Deciding whether a native or Web-based app is best for your client comes down to the audience they are trying to reach. Mobile Web apps are a good fit if:


Your audience is searching for you primarily from a mobile Web browser;
Users are on a multitude of devices (iPhone, Android, BlackBerry, etc.);
The development team has more skill in HTML, CSS and JavaScript than Objective C, Java, etc.

How To Design A Mobile Web App
Those of you who have designed iOS native apps are used to fixed-width and -height images that are positioned and aligned in the Interface Builder (or using code). Designing mobile Web apps is different: you’re designing for the browser again, just as you would for a typical website.

What does this mean? It means you can take advantage of a lot of cool CSS design tricks. In many cases, you can design an entire interface using CSS instead of images.

Technology Analysis: jQTouch or Sencha Touch?
To help you determine which development platform best fits your project, I’ve done some research on two Web technologies that focus on mobile Web apps: jQTouch and Sencha Touch.

jQTouch is powered by jQuery, a highly popular JavaScript library, and is geared to Web designers and novice Web app developers. jQTouch progressively enhances HTML and CSS so that less capable phones are still able to browse content. The primary method of creating functionality in jQTouch is with HTML and CSS or with jQuery-style event callbacks.

Sencha Touch, on the other hand, is geared more to software developers and has a pure Javascript API for building powerful apps. It is powered by a custom core that is optimized for mobile, which inherently makes the core level in Sencha Touch lighter and better optimized than that in jQTouch. It offers a wider array of features and components and is better suited to mobile developers who are creating apps with advanced layouts, functionality and interfaces.

For myself, I wanted an interface that looked and felt like a native app as much as possible. I decided to go with the Sencha Touch development platform because of its ability to handle advanced layouts and interfaces.

Ultimately, you have to do your own research and answer these questions:


What kind of functionality does the app need?
What technology supports that functionality?
How do the costs of these technologies compare?
What can I afford?
Do I know of high-quality developers of this technology?

Once you have this data, you can make an informed decision on the technology platform for your project.

Where Does This Leave Us Non-Coding Designers?
If you fall squarely in the category of designer, don’t worry. You can still design the interface in Photoshop, as I did in the example below. I leave the CSS beauty to the experts, letting them translate my images into code that looks exactly like my design.

Example Project: The Roookies App
Now, I’ll cover a practical example of how to create a mobile Web app using Sencha Touch. I teamed up with Sencha’s CTO, James Pearce, to design an app called Roookies. Roookies helps Dribbble newbies gain exposure on the network by featuring only rookie artwork.

I designed the Roookies app as I would a native application, using a 640 × 960 iOS design template found on Tapptics. This gives my developer a reference  when they create the CSS code that will mimic my images. And for any images that cannot be duplicated via CSS, my developer will slice out and insert transparent PNGs.



Coding the Roookies App
Now I’ll demonstrate how to use CSS, Sass and Compass to style and theme mobile Web applications built with HTML5 and the Sencha Touch JavaScript framework.



An Introduction to Sass and Compass
Sass is an extension of CSS that adds new syntax to allow for things like variables, mixins, nesting, and math and color functions. This makes it much simpler to create CSS that is easy to maintain and that doesn’t repeat itself.

For example, in Sass we can write the following:

$blue: #3bbfce;
$margin: 16px;

.content-navigation {
border-color: $blue;
color: darken($blue, 9%);
}

.border {
padding: $margin / 2;
margin: $margin / 2;
border-color: $blue;
}
When we compile it to CSS, the output will look like this:

.content-navigation {
border-color: #3bbfce;
color: #2b9eab;
}

.border {
padding: 8px;
margin: 8px;
border-color: #3bbfce;
}
This is extremely powerful, because it means we can potentially change color schemes, layouts and more with one set of simple parameters — and assuming that the Sass has been structured well, those changes will cascade throughout all of the resulting CSS. (You can do much more than this, and you should check out the Sass website for more information on how the language works.)

Compass is an extension to Sass, and it provides a whole set of CSS3 mixins and an extension system. It’s particularly useful for handling cross-browser CSS prefixes. Take this:

$boxheight: 10em;
.mybox {
@include border-radius($boxheight/4);
}
This will compile to the following CSS:

.mybox {
-webkit-border-radius: 2.5em;
-moz-border-radius: 2.5em;
-o-border-radius: 2.5em;
-ms-border-radius: 2.5em;
-khtml-border-radius: 2.5em;
border-radius: 2.5em;
}
You can learn more about what Compass brings to the styling process on its website.

Using Sass And Compass With Sencha Touch
Sencha Touch is an HTML5, CSS3 and JavaScript framework that allows you to develop mobile Web apps that look and feel native on iPhone, Android and BlackBerry touch devices.

Because the framework uses Web technology to create apps that run in the browser, these apps can easily be themed using tried and trusted CSS. And because Sencha Touch uses Sass and Compass, we can use these techniques to also create beautiful and elegant themes for mobile applications that were built this way.

For this article, we’ve built a simple Sencha Touch app called Roookies. It uses a JSON API to create a gallery of shots by first-time users of Dribbble, a popular design showcase service. (While we won’t get into how the app was built, you can read a sister article about how it works.)

To follow along here, we recommend you grab a copy of the app’s source code, because it also includes the theming components you’ll need. It’s hosted on GitHub, so you can either fork that repository or simply download it as a ZIP file. An unthemed version of the app is also hosted online; you can try it out with a touch device or a WebKit-based desktop browser.



Before you do any theming on this app, you’ll need to install Compass (which has Sass built in). The command line tool itself is Ruby-based, which means that Ruby is a dependency. If you’re a Mac user, Ruby is already installed on your operating system, and the easiest way to install Compass is as a Gem from the command line:

> sudo gem install compass --pre
(We use the --pre flag to ensure that the latest and greatest version of Compass is installed. Sencha Touch requires version 0.11 or later.)

If you are on Windows or a system that doesn’t have Ruby already installed, then you’ll need to install Ruby and Gem first, using something like RubyInstaller for Windows.

How Sencha Touch Uses Sass
Each component of the Sencha Touch user interface library has its own Sass file, which you can easily take and edit. But sometimes, the easiest changes can be made by altering certain important Sass variables (as we did in the examples above) to make changes globally across the application’s theme.

In the Roookies application, you’ll find a folder named theming. In it, create a new Sass file named mytheme.scss. The .scss extension is the convention for Sass files. In this file you can link to the parts of the Sencha Touch theming system that are used in the Roookies application:

@import 'sencha-touch/default/all';
@include sencha-panel;
@include sencha-buttons;
@include sencha-sheet;
@include sencha-tabs;
@include sencha-toolbar;
@include sencha-list;
@include sencha-layout;
@include sencha-loading-spinner;
The first line links to all of Sencha Touch’s sub-theming files, and the subsequent lines call mixins for the UI elements used in our application. Mixins are really just functions: they basically insert blocks of CSS into your document.

Most of these mixins use a set of global variables to alter the appearance of different parts of the user interface. For example, the $base-color variable modifies the overall color of the application. Set the following variable before the @includes so that they all use this new value, a tasteful green:

$base-color: #709e3f;

@import 'sencha-touch/default/all';
@include sencha-panel;
@include sencha-buttons;
…
When you save that file, you will be good to compile the CSS. In the same directory, run Compass on the command line, like so:

> compass compile mytheme.scss
If all goes well, Compass should output the mytheme.css file in the same directory. As with all websites and apps, you’ll need to reference this new CSS file in the application itself. You can do this either by adding a magic query string to the Roookies application URL (something like http://myserver.com/roookies?style=theming/mytheme.css) or, more traditionally, by hardcoding the reference into index.html:

<link rel="stylesheet" type="text/css"
href="theming/mytheme.css"/>
(If you do hardcode the theme like this, you should remove the script block in index.html, which is responsible for supporting the query-string theme-switching technique.)

If all goes well, the theme should now appear with the new color, both in the toolbar and in a lighter shade for selections of the list itself:



(The fact that the color of the list selection is derived from, but not exactly the same as, the base is another clever Sass trick. Color functions such as darken and saturate allow you to formulaically link color values.)

Sencha Touch has a full list of the variables that can be altered to change the look and theme of an app.

Embedding Regular CSS
If all this talk of Sass and Compass is confusing, the good news is that even an .scss file can contain regular old CSS, too. So, in addition to your variables, mixins and functions, you can just start doing static styling to finesse the theme.

Let’s say we want to frame the images in the list. In the Roookies app, all of the images have the HTML class attribute shot-image, so we can easily style them as normal:

img.shot-image {
display:block;
padding: 8px;
margin: 0px auto;
border: 1px solid #666;
-webkit-box-shadow: 0 0 4px rgba(#333, .5);
background:#eee;
clear:both;
width:304px;
}
Also, the container in which each image is placed is a div with the class shot, and we can easily adjust its padding so that our framed image still fits well within the list’s width:

.shot {
padding: 8px 0!important;
}
One useful way to find out the classes of elements in a mobile Web application is to use the inspector tool in a WebKit-based browser such as Chrome. Right-click on an element to inspect it and see how it looks in the browser’s DOM:



Add these to the bottom of the .scss file and compile again. The app’s images should now have more subtle styling, making the gallery look slightly smarter:



Embedding Images In CSS
One consideration when building mobile Web apps is the number of requests that the browser needs to make to the server to display a page. And it’s often the case that CSS points to external files, such as images, in the theme. One thing that is very easy to do with Compass, though, is to embed images in the CSS itself, using base64 encoding inside a “Data URL.” These are URLs that start with data and that allow you to specify binary resources inline. This means that the entire theme is encapsulated in one file, and the device has to make only one request to the server to receive all of the parts.

The inline image function is an easy way to do this. In our theming environment, it pulls in images from the images sub-directory. So, the wood.jpg image in that directory can be embedded in the CSS as the background of the gallery, like so:

.shot {
background:inline-image("wood.jpg", "image/jpg");
}
In the resulting CSS, it appears like this:

.shot{
background:url('data:"image/jpg";base64,/9j/4AAQSkZJR…');
}
This gives the app a tasteful wooden background:



Font Support
Many current mobile browsers support Web fonts, and there’s nothing like a custom typeface to distinguish your mobile application. One of the easiest ways to put a Web font on a website or application is with Google’s WebFont service, which requires you to declare an extra CSS rule by linking to your chosen font in the index.html file:

<link href='http://fonts.googleapis.com/css?family=Pacifico'
rel='stylesheet' type='text/css'>
You can also use the CSS @import rule to pull this into the .scss file itself:

@import "http://fonts.googleapis.com/css?family=Pacifico";
Both of these techniques create an @font-face rule that allows you to use font-family:'Pacifico' anywhere in your CSS.

Below, we’ve applied a style to the user interface — in this case, the text in the toolbar, which uses the class x-toolbar-title:

.x-toolbar-title {
font-family: 'Pacifico';
}
The result is as follows. A little quirkiness in the title bar and a distinctive look and feel to our application.



Conclusion
Of course, we’ve just scratched the surface here. There are many more powerful (and dramatic) ways to style and theme a mobile Web application. We’ve continued this process to create a fully featured theme for the Roookies app, and you can see the results for yourself, including the styled image meta data and the styled details page when you click on an icon under the images. You can also see the complete .scss file that was used to create this theme; it’s distributed as part of the GitHub project.

Have you created a mobile Web app with an extraordinary design aesthetic? Let us know in the comments section below!

Mobile Web App Resources

“Will Mobile Web Apps Eventually Replace Native Apps?”
“Mobile Web vs. Native App: Give It a Rest”
“Mobile Web vs. Native App”
“How Mobile Web Will Prevail Over Native App”
“Web App Masters: Native or Web-Based Mobile Apps?”

(kw)


© Jen Gordon for Smashing Magazine, 2011.
]]></description>
<dc:subject>Developer's_Toolbox</dc:subject>
<dc:identifier>https://pinboard.in/u:anu/b:ef42e322ade6/</dc:identifier>
<taxo:topics><rdf:Bag>	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:Developer's_Toolbox"/>
</rdf:Bag></taxo:topics>
</item>
<item rdf:about="http://uxmag.com/articles/change-on-a-dime-agile-design">
    <title>Change on a Dime: Agile Design</title>
    <dc:date>2011-07-18T17:44:35+00:00</dc:date>
    <link>http://uxmag.com/articles/change-on-a-dime-agile-design</link>
    <dc:creator>anu</dc:creator><description><![CDATA[By John Anderson
    
            
                    An overview of agile development and working as a designer in agile environments.

        
        

What does it mean to have a good experience? Think of your favorite restaurant, the interior of your car, and the software on your phone; how do people craft these experiences? What details, planning, and design go into the process?

Would it be possible to create a great experience if you were limited from laying out a full design before you got started? That’s the typical scenario in designing a user experience within the realm of agile software development. As a designer, how do you manage in an environment with such a quick pace and changing specifications? This article provides a brief overview of agile development and gives several tips for working as a designer in this environment.

read more

   
]]></description>
<dc:subject>Strategy Requirements_and_Specifications</dc:subject>
<dc:identifier>https://pinboard.in/u:anu/b:56f6673188d3/</dc:identifier>
<taxo:topics><rdf:Bag>	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:Strategy"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:Requirements_and_Specifications"/>
</rdf:Bag></taxo:topics>
</item>
<item rdf:about="http://lists.mysql.com/replication/2114">
    <title>MySQL::Replication - peer-to-peer based, multi-master replication for MySQL</title>
    <dc:date>2011-07-15T11:08:06+00:00</dc:date>
    <link>http://lists.mysql.com/replication/2114</link>
    <dc:creator>anu</dc:creator><description><![CDATA[Comments]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:9b64b9a49eca/</dc:identifier>
</item>
<item rdf:about="http://laughingsquid.com/dean-martin-burgers/">
    <title>Martin Burgers</title>
    <dc:date>2011-07-12T00:45:01+00:00</dc:date>
    <link>http://laughingsquid.com/dean-martin-burgers/</link>
    <dc:creator>anu</dc:creator><description><![CDATA[Dean Martin’s recipe for hamburgers. Sounds perfect.



 ★ 
]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:f26b1c1f5db0/</dc:identifier>
</item>
<item rdf:about="http://www.youtube.com/watch?v=_V4q-zb2iI4">
    <title>Talking Funny</title>
    <dc:date>2011-07-08T09:05:12+00:00</dc:date>
    <link>http://www.youtube.com/watch?v=_V4q-zb2iI4</link>
    <dc:creator>anu</dc:creator><description><![CDATA[Ricky Gervais, Chris Rock, Jerry Seinfeld, and Louis C.K. deconstruct comedy  ]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:117af4fbe545/</dc:identifier>
</item>
<item rdf:about="http://oreilly.com/catalog/9781449397296">
    <title>Matt Neuburg’s ‘Programming iOS 4’</title>
    <dc:date>2011-07-07T03:59:27+00:00</dc:date>
    <link>http://oreilly.com/catalog/9781449397296</link>
    <dc:creator>anu</dc:creator><description><![CDATA[Hot off the O’Reilly presses: Matt Neuburg’s 834-page iOS programming tome. Neuburg is my favorite programming book writer, period.


(Buy it from this link to Amazon and I’ll get the kickback dough; I’d have linked with Neuburg’s Amazon Associates code, but he lives in California so that won’t work anymore.)



 ★ 
]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:5ed750a10b1a/</dc:identifier>
</item>
<item rdf:about="http://www.smashingmagazine.com/2011/07/05/free-wordpress-themes-2011-edition/">
    <title>Free WordPress Themes: 2011 Edition</title>
    <dc:date>2011-07-05T12:46:06+00:00</dc:date>
    <link>http://www.smashingmagazine.com/2011/07/05/free-wordpress-themes-2011-edition/</link>
    <dc:creator>anu</dc:creator><description><![CDATA[



      
        
    



It’s interesting to look back at our previous WordPress themes round-ups. It’s almost like looking at a visual timeline not only of WordPress’ advances in theme design, but of the rapid development in functionality of the CMS itself. The themes from year to year clearly differ in style as Web design trends have evolved. As each year passes and more functionality is added to WordPress’ core, these improvements are strongly reflected in the themes developed for it.

Once upon a time, all WordPress themes looked like traditional blogs, with basic functionality and not a heck of a lot more. But as you will see from the themes below, that original “blog” design style is clearly gone, perhaps never to be seen again. It makes you feel nostalgic.

Nowadays, user requirements for WordPress themes are very high. Users expect all themes (including free ones) to have pages for admin options built in, where you can quickly set up your website and personalize it with a minimum of fuss. With the rise of these options pages, niche-specific theme designs (such as for portfolios, blogs or magazines) are no longer required and are, in fact, few and far between.

Most of the themes below can be tailored via the options panel to be anything you want, whether a portfolio, a content-heavy magazine-style website or a basic blog. Setting one up takes only 10 minutes. This actually gave us a few problems when it came to categorizing the themes below. We spend a lot of time researching, collaborating on and writing these round-ups. In fact, it is a Smashing Magazine tradition to publish the top 100 WordPress themes from the previous 12 months (this is our fifth edition).

Portfolios, Galleries And Showcases
Portfolium (Demo)
Portfolium is a clean and flexible WordPress grid-based portfolio theme, designed in a modern and minimalist style. It is ideal for designers, artists, photographers and other creative specialists who require a professional portfolio theme.



Shaken Grid (Demo)
Shaken Grid uses the jQuery Masonry plug-in, which “arranges elements vertically then horizontally according to a grid.” The theme is perfect if you need a gallery or portfolio or just want a unique grid layout.



Big Square (Demo)
Big Square is a stylish photoblog theme with a built-in gallery that is focused entirely on highlighting your creative visuals.



Journal Crunch (Demo)
Journal Crunch is a gallery and portfolio theme with all of the features you would expect from a premium theme: easy set-up via the options page, plenty of shortcodes, built-in pagination, Twitter widgets, AJAX contact form and much more.



Paragrams (Demo)
Paragams is a lightweight theme that is built on a grid and that could be used for various types of websites: portfolios, photoblogs even online magazines.



Imbalance 2 (Demo)
Imbalance 2 turns you WordPress-based website to an attractive blog, portfolio or online magazine. This free template has a strictly modern style with a minimalist touch.



Photoria (Demo)
Photoria is a clean feature-rich theme that would be perfect as a photoblog or portfolio. It comes packaged with a variety of templates and built-in SEO (via its extensive options page), and the theme is internationalized for easy translation.



Muse (Demo)
Muse is a simple gallery theme that can be used as either a portfolio or an inspirational showcase. It comes with custom page templates and built-in SEO, and it can be combined with a ratings plug-in to create an all-singing, all-dancing showcase website.



mimiThem (Demo)
This is far and away the most basic theme in this article. But don”t be fooled: it works effectively as a quick and easy way to get your portfolio online.



Dione (Demo)
Dione is a video showcase theme that uses the custom post type feature available in WordPress 3+.



Business And Corporate Websites
Academica (Demo)
Academica was designed specifically for educational institutions such as universities and schools. It’s a flexible and versatile free theme that can be easily customized and branded for any university, academy or non-profit organization.



Rotary (Demo)
Rotary is a two-column business theme that was built with all of the fantastic features of WordPress 3.0. It is centered on the idea of running your blog as a CMS.



Vanadiumitic (the link was removed due to the suspicious code of the theme)
Vanadiumitic comes with a featured content section, a dropdown menu, subscription buttons (Twitter, Facebook and RSS), an automatic thumbnail resizer, and widgets for popular and featured posts and featured videos, all packed in a powerful framework for easy back-end customization.



Aurelius (Demo)



Gameliso (Demo)
This one’s a lovely clean theme.



Zincious (Demo)
The Zincious theme comes with a dropdown menu, subscription buttons (Twitter, Facebook and RSS), an automatic thumbnail resizer, a widget for popular posts, a featured content slider and a robust framework for easy back-end customization.



Ikonik (Demo)
Ikonik was designed as an online design store, although no e-commerce system is integrated. It could be used as a simple portal for selling vectors, icons, logos, buttons, themes and pretty much anything else.



Minimalist Themes
Expositio (Demo)
Expositio is a simple portfolio theme for photographers, designers and artists. Its integrated options help you customize the template from font to color.



Sutra (Demo)
Sutra is a minimal theme focused on simplicity, putting the writing front and center.



Extricate (Demo)
Extricate is a clean, minimal theme built on HTML5 and CSS3. The options page allows you to resize columns and specify post information.



Renova (Demo)
Renova comes with two backgrounds (full white or paper), six link colors, jQuery support for hover effects and mobile device support. The minimal style is for writers who need a simple layout without any distraction.



Feijoa (Demo)
This is a four-column layout with a simple sidebar and was designed using the jQuery Masonry plug-in.



Simply Delicious (Demo)
This minimalist theme features big images, a clean style and easy browsing: perfect for modern blogs and portfolios.



Wordfinder (Demo)
Wordfinder is a simple magazine-style theme for users who want to start a blog with a minimal layout. The theme has many layout features, including two home page styles and six colors for links and hover effects that are easily customizable via the options page.



Theophilus (Demo)
This jQuery-based, Cufon-enabled, lightweight and minimal WordPress theme was developed by Timothy Long.



Blogum (Demo)
Blogum is a simple grid-based blog theme, designed with a modern and minimalist style. It supports all WordPress 3.0 features, giving you extra flexibility.



Mini Hyper (Demo)
Mini Hyper comes with a basic options page where you can add your analytics tracking code and change the logo. Other than that, Mini Hyper is widget-ready and works in all browsers. 



Min (Demo)
“No bells and whistles, just simple and to the point.” Min’s main content area is set at 560 pixels, and it has two widget-ized footer areas to handle navigation and anything else you feel like putting there.



Papaver (Demo)
Papaver is an elegant, minimal theme. You can set the content to one, two or three columns.



Codium Extend (Demo)
Codium Extend is a minimalist theme that supports all of WordPress 3+’s features and comes with support for smartphones (iPhone, etc.) and tablets (iPad, Galaxy Tab, etc.).



Delicate (Demo)Delicate is a clean, minimalist theme with a focus on typography and structure.



Melville (Demo)
Melville was inspired by classic literature. It has no distractions; just a simple design that focuses the reader on your writing.



Fresh and Clean (Demo)



Yoko (Demo)
Yoko is a modern and flexible theme, with a responsive layout based on CSS3 media queries. The design is optimized for big desktop screens, tablets and smartphones. You can use new post formats (such as Gallery, Aside and Quote), choose your own logo and header image, and customize the background and link color.



Hybridside (Demo)
With a minimal design and simple structure, Hybridside allows writers to choose the body background and the color scheme for links. It has full support for thumbnails, WordPress menu navigation, five widget areas and a print-friendly style sheet.



Aqualine (Demo)
Aqualine is a unique and minimalist theme that has an extensive options page. Pick your own color accent, choose between thumbnails and excerpts or the full content for the main page, and more.



The Scoop (Demo)
The Scoop is a four-column minimal magazine-style theme, with a focus on elegant typography. It is ideal for content-heavy websites.



David Airey Theme
David Airey has released his old blog’s design as a free WordPress theme. As you probably know, that minimal design offers the perfect platform for your writing.



The Columnist (Demo)
The Columnist was inspired by the grid structure and typographic techniques of traditional newspapers. It was designed with a grid-based layout, an elegant typographic hierarchy and some CSS3 and jQuery greatness.



Swiss Dessign (Demo)The four themes below, originally featured on Smashing Magazine in January, are simple yet powerful, with a touch of traditional Swiss design and layout. Their distinct style is what separates them from the other themes. They allow you to select the focus of your work, since you are the artist and should be in control of the visitor’s experience. Each theme comes with a full video overview and support for using and managing it.



Studio Dessign (Demo)



Minimal Dessign (Demo)



Style Dessign (Demo)



Simplest Free WP Theme
This is perhaps the most basic WordPress theme you’ve ever seen. It’s so basic that it’s not even worth showing a screenshot of it. But it is useful. It’s a fully functional theme that would be perfect for anyone looking for a barebones WordPress framework. It has only 83 lines of PHP and 75 lines of CSS.

Blogs And Personal Websites
Spectacular (Demo)
This theme was commissioned by Smashing Magazine and designed by Maleika Esther Attawel. It offers a warm and comfortable environment for personal musings. It comes in two flavors: HTML 4.01 and HTML5. Both German and English versions are included in the download package.



Seven Five (Demo)



Protean (Demo)
Protean is a WordPress theme from Landau Reece that allows bloggers to customise their website design for individual blog posts.



Skeptical (Demo)
Skeptical’s layout is flexible: you can display “Related posts” next to your latest posts on the home page or have a completely widget-based sidebar. You can also add your Flickr stream to the footer and showcase three noteworthy blog posts with a tag that you declare in the settings.



Graphite (Demo)
Graphite, built by Medialoot from the ground up using HTML5 and CSS3, comes with portfolio post types, two alternative home page image sliders and built-in admin settings.



Harimau Malaya (Demo)
Harimau Malaya was purpose-built as a throwback to when blogs looked like blogs. It is a simple but complete theme, suitable for every blogger out there.



Pongsari (Demo)
Pongsari, a simple and clean theme, was built using the WordPress 3+ default theme TwentyTen as a framework. It comes with support for WordPress 3+ thumbnails and custom menu functions.



Typominima (Demo)
Typominima is a free, minimal typography-based theme that was designed to enable writers and publishers to express themselves online in a clean and beautiful environment.



Edgy Ellen (Demo)
This theme from WP Classic has a stylish design, clean grid patterns and custom typography. It comes with an options panel that will help you set up your website in no time.



Copperific (Demo)
Copperific has a stylish slider to showcase highlights of your portfolio. It also has a built-in Twitter and Facebook button for easy sharing of posts. For monetization, it has four 125×125 banner ads that are integrated in the system’s back end. It has a custom dropdown menu, an automatic thumbnail resizer, a widget for popular posts and a lot more.



Grey (Demo)
Grey is generic enough to be used for almost any kind of blog. Whether it’s a blog about design, photography, fashion or some other passion, the Grey theme should suit your needs. It is built on a simple layout, but with a lot of little touches of subtle details and textures.



Neonsential (Demo)
Neonsential brings a grungy yet elegant look to your blog. The fancy home page slider highlights your featured posts. It is WordPress 3.0-compliant and backed by a robust framework for quickly setting up your website.



Anniversary (Demo)
As the name suggests, Anniversary was built as a celebration of and thank-you to WordPress. It’s a classic-looking theme, with several layout options and a customizable “Thank you, WordPress” banner in the header.



Shopping/Ecommerce Theme
Velvet Sky (Demo)
Velvet Sky is a Prestashop and WordPress shopping theme that was recently released on Smashing Magazine. It features a custom homepage with combo slider, horizontal and submenu menu integration, custom slideshow, it supports one page checkout and guest checkout and is IE7+, Safari, Opera, Firefox, Chrome compatible.



Mobile-Optimized Themes
iPhonsta (Demo)
Offering a mobile version of your website is an easy way to strengthen your visitors’ loyalty. iPhonsta has a fluid layout, it fits most mobile screens (despite its name, it will work on most smartphones), and it configures the font size automatically.



jQuery Mobile
This theme is optimized for mobile devices, such as iPhone, Android and BlackBerry. It is a great starting point for building a mobile website.



Magazine-Layout Themes
Agency (Demo)
Agency is a magazine-style theme that puts your content in a beautiful wrapper, complete with subtle, elegant page elements. It features a custom slideshow, a built-in contact form, custom gallery styles with lightbox functionality, and two widget-ized sidebars.



Nublu (Demo)
This sleek blue theme comes with a configurable slider, drop-down menus and Cufon-enabled headlines. It also comes with automatic thumbnail generation and the WordPress 3+ menu system, and it sports a Twitter bird that sings your latest tweets.



Splendio (Demo)
Splendio has a unique magazine-style design, based on the TwentyTen theme.



Ophion (Demo)



Sight (Demo)
Sight, previously featured on Smashing Magazine last November, is a powerful theme that is best suited to magazines-style blogs. It was built on a grid and has a modern minimalist style. Customize the content view using either the standard blog view or the grid view.



Lucky Guess (Demo)
Plenty of CSS3 techniques are used in this theme. You will notice both loud and subtle text shadows in the headings, text orientation effects and box gradients. The theme also makes use of Google fonts, which render much faster than the popular Cufon fonts.



Yellow Magazine (Demo)
This theme could be used for a magazine-style website or, just as effectively, for a corporate or business layout. It comes with a basic options page, built-in pagination, a content slider and integrated social bookmarking buttons.



Suburbia (Demo)
Suburbia is a clean and flexible grid-based magazine theme with a modern and minimalist style. The theme is suitable for most types of websites, including blogs, online magazines and portfolios.



The Morning After (Demo)
At 100,000 downloads, The Morning After is the grandfather of modern WordPress magazine themes. Originally designed by Arun Kale, it was bought last year by WooThemes, which has restructured and modernized the theme with its own powerful development framework.



Distant Dawn (Demo)



iTheme2 (Demo)
iTheme2 is the perfect theme for technology- and Apple-related blogs. It uses media queries to target different displays, such as desktops, notebooks, iPhones and iPads, and other mobile devices, without a plug-in. The layout automatically adjusts to the user’s viewing area.



Magazine 1 (Demo)
With its simple, stylish and dark design, Magazine 1 is a professional solution for any blog or magazine website. It features jQuery content sliders, a “Most popular posts” widget and multiple colors for the background and content. It is easy to customize and use.



Custom Community (Demo)
Custom Community is a BuddyPress theme that enables you to easily build a website with all of BuddyPress’ built-in features: the easy-to-use jQuery slideshow, post templates with thumbnail integration, and a powerful options page for customizing every part of the theme.



Aluminiumism (Demo)
The Aluminiumism theme has a grungy watercolor style yet still maintains a classically clean look. It features a prominent content section, a dropdown menu, subscription buttons (Twitter, Facebook and RSS), an automatic thumbnail resizer, widgets for popular and featured posts and featured videos, and a heck of a lot more.



Elegant (Demo)
Elegant is a simple yet professional theme. It has two color schemes (black and white) and is best suited to corporate magazines but is flexible enough for blogs and portfolios.



Amphion Lite (Demo)
Amphion Lite comes packaged with two skins, a home page content slider, integrated social sharing buttons, custom page templates and a lightbox plug-in for image galleries.



“Coming Soon” And Landing Pages
Landis (Demo)
Landis is a simple one-page landing or “Under construction” WordPress theme. It keeps your users informed while you build your amazing new website. The quick landing page simply tells visitors what is going on and when your website will launch.



Timelaph (Demo)
Timelaph is a sleek, dark, spaced-out theme for landing pages and email newsletter subscription pages. It integrates easily with Feedburner to redirect RSS feeds and help build your email subscriptions.



Holding Pattern (Demo)



Placeholder (Demo)
This landing page is perfect if your website is in development and you simply need to let visitors know how to get in touch with you. Also, the built-in countdown timer is a nifty way to tell visitors when the project will launch.



Coming Soon (Demo)



Theme Development Frameworks And Bare-Bone Themes
Platform
This is the free version of Platform, a drag-and-drop design framework for WordPress. With this framework, you can design and build your website faster than ever before, entirely in WordPress’ back end.



Roots
Roots is a starter WordPress theme made for developers and based on HTML5 Boilerplate, Blueprint (or 960.gs) and Starkers. It helps you rapidly create brochure websites and blogs.



HTML5 WordPress Shell
With this framework, you get custom templates (including 404 and 503 error pages), the mother of all WordPress body tags, support for WordPress’ new menu system, Modernizr (i.e. HTML5 feature detection) and an HTML5 reset style sheet, @font-face examples, support for iPhone detection, and IE conditional style sheets.



Boilerplate: Starkers
This Boilerplate framework was developed by combining HTML5 Boilerplate and the bare-bones Starkers into a minimally marked-up, HTML5-ready framework. The Boilerplate theme is designed to function as a parent theme to whatever child you would like to add. But you could just as easily use this as a starting point and alter the PHP as your design requires.



TwentyTen Five
TwentyTen Five was originally launched in the Smashing Magazine article “Using HTML5 to Transform WordPress’ TwentyTen Theme.” It is basically an HTML5 upgrade of the default TwentyTen theme, and yet it is much more than that. With its support for brand new HTML5 elements and its compatibility with all modern browsers (although to use HTML5 with IE versions 6 to 8, you need a pinch of JavaScript, which is included), this theme is perfect as a development framework. 



Theme Starter (Demo)
This is a starter theme for those who are looking for a starting point in WordPress without having to dissect anything more complex. The theme is WordPress 3+ compatible and uses the new menu navigation and thumbnail functionality.



Constellation (Demo)
This great starting point gives you the flexibility to provide bespoke styles for different devices, totally up-to-date HTML5 code (which is fantastic for SEO) and a flexible grid system, on top of all of the other goodness bundled in the HTML5 Boilerplate.



Bones
This feature-rich bare-bones theme was built using some of HTML5 Boilerplate”s recommended mark-up. It also has a ton of features, such as page navigation, breadcrumbs, a widget for related posts, HTML5 video with fallback and a heck of a lot more. Bones was designed to make the developer”s life easier; it”s meant to be hacked until it fits what you”re looking for.



Skimpy
Skimpy has basic WordPress 3.0 functionality, including custom menus, thumbnails and custom sidebars. A couple of other useful tweaks are commented out, but you can comment them in and do what you want with them. The only style included is a container that sets the width to 900 pixels.

Further Resources
For nostalgia, or perhaps to visually track the development of WordPress themes, browse back through the top 100 WordPress themes from previous years.

Please note that some of those themes (especially the ones from 2007 and 2008) may be outdated and incompatible with the latest version of WordPress. Use with caution.


100 Free High-Quality WordPress Themes: 2010 Edition
100 Amazing Free WordPress Themes for 2009
100 Excellent Free WordPress Themes: 2008 Edition
Beautiful WordPress Themes You (Probably) Haven’t Seen: 2007 Edition

(al)


© Paul Andrew for Smashing Magazine, 2011.
]]></description>
<dc:subject>Design themes WordPress</dc:subject>
<dc:identifier>https://pinboard.in/u:anu/b:9eac3dce8cb5/</dc:identifier>
<taxo:topics><rdf:Bag>	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:Design"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:themes"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:WordPress"/>
</rdf:Bag></taxo:topics>
</item>
<item rdf:about="http://radar.oreilly.com/2011/06/google-docs-wordpress-indesign-workflow.html">
    <title>How one newspaper rebooted its workflow with Google Docs and WordPress</title>
    <dc:date>2011-06-30T16:00:00+00:00</dc:date>
    <link>http://radar.oreilly.com/2011/06/google-docs-wordpress-indesign-workflow.html</link>
    <dc:creator>anu</dc:creator><description><![CDATA[Digital media not only forces newsrooms to face economic challenges, but also workflow issues. In a recent post, Todd Benoit, director of news and new media at the Bangor Daily News addressed the root of the workflow problem in his newsroom:



Like many newsrooms, until very recently we were production heavy because we had to be. Moving stories to the web was a copy-and-paste affair, but that's not where the trouble started. If you begin with a print-directed front-end system, as we did, how does that system accommodate a story being updated from the field? Or how would the full possibility of story assets land online, to be chosen among for print? Even simpler: When do reporters add links? The answers, as countless journalists know, are: It can't; they won't; they don't. From there, it's all production, not creation.



The Bangor Daily News attacked the problem head on, incorporating Google Docs and WordPress into a new front-end system that handles the flow of news in the digital era. As Benoit describes the solution:



... the guiding ideas we have put into practice are to match the tool to the job we need done (rather than the reverse), reduce the number of steps required and anticipate how our audience will want the information next. And the cost should be next to nothing.



To find out more about how the project came about and how it works in practice, I reached out to William Davis (@williampd), the online editor at the Bangor Daily News and the architect of the new system.


Our interview follows.




How did you end up gravitating toward a Google Docs / WordPress / InDesign system?



William Davis: My boss [Todd Benoit] has a great post on our dev blog on the topic, and I talk about it a bit on one of my blog posts as well.


We picked Google Docs purely for its ease of use and its collaboration tools. We wanted a place where reporters could work on their articles easily from wherever they are — we have quite a few bureaus, and our reporters often file from events. The collaboration tools are terrific and have really proved useful, for example, when we're editing articles on tight deadlines or when reporters are working on stories together. On Election Day we had three reporters at different campaign headquarters all working in one doc, and it went very smoothly.


We chose WordPress because we wanted a content management system (CMS) that allowed us to develop components quickly and easily. WordPress has a great API and it's very extendable — we've been able to easily change pretty much any part of the CMS without hacking the core, which allows us to maintain the integrity of the system.


Both systems are quickly evolving and pushing boundaries in their fields, without any prodding from us. WordPress has frequent updates that push the platform to a new level, and Google Docs' collaboration tools, for example, are second to none.


Finally, we chose InDesign because it is the industry leader in page design software.


TOC Frankfurt 2011 —  Being held on Tuesday, Oct. 11, 2011, TOC Frankfurt will feature a full day of cutting-edge keynotes and panel discussions by key figures in the worlds of publishing and technology.
 
Save 100€ off the regular admission price with code TOC2011OR




What was involved in developing the system?




William Davis: We started development in August [2010] or so, and it's still ongoing. We launched things on a rolling basis by department, and started with sports, which turned out to be the hardest because it's the most complex. We then rolled out politics in time for the elections. We got the entire newsroom using Google Docs early this year. 


The display desk transitioned to InDesign in April, and then earlier this month we finished the website transition and turned off our old systems. As we developed the components needed for each department, we would move them over, test and tweak things, and then move on to the next department.




What are some of the major challenges you've encountered?



William Davis: We've had a few instances where Google has changed the way they structure their content in Google Docs or changed the way a part of the API works and we've had to adapt. We've also faced the usual technical problems that come with hosting any large website, but we haven't really encountered any challenges that we weren't able to solve fairly quickly. 


Some components we've rebuilt a few different ways and will probably rebuild again. The wire feeds are an example. Those were originally running directly into WordPress. We decided we didn't want to put the strain of tens of thousands daily stories and photos on our website and so we tried running the wires directly into Google Docs. We encountered problems there, as well. I`n the third iteration, which we're using now, we have a separate script that ingests the wires and provides a way to browse them, then sends the stories we want into Google Docs. That's worked pretty well, though that's not to say we won't rebuild that component or others in the future as needed. 


The great thing about building our own system is that we can tailor it to our needs. Because we're doing it all in-house, we can change quickly, rather than waiting for a corporation to adapt with us.




Was it difficult for people to adapt to the new system?



William Davis: With a transition to any new system, there are of course going to be problems, but I think the ones we've encountered have been pretty minimal. Reporters seem to have had a pretty easy time adapting to writing in Google Docs — many of them, especially bureau reporters, were already using the system to write their articles. They understand why it's important to move content quickly through the system so their articles have the best chance to succeed online. 




Can you give us a walk-through of the publishing steps involved — from story idea to final web and print versions?



William Davis: Reporters start their stories in Google Docs, and when they're finished, they drop them in a folder for their section — Metro, State, Business, etc. Editors read the story and move it on to a copy editing queue, where a digital desk editor reads it before sending it to WordPress. 


In WordPress, the digital desk editors will categorize it, attach media such as photos and video, and then they will publish the story. This is done throughout the day — we have digital desk staff on from 5 a.m. until midnight. When the display desk comes in to lay out the paper, all they have to do is find the story in the InDesign plugin we built and bring it onto the page. 


Everything comes onto the page fully formatted, though the digital desk is responsible for writing their own headlines for print. They can do this either on the page or in a module I built for WordPress that provides a WYSIWYG headline-writing interface.


Davis offers a tour of the new system in this screencast:







How many people actually touch the copy before it's published?



William Davis: As is the case in any newsroom, that varies by article. The digital desk editors, in addition to being copy editors, sometimes act as backfield editors, such as on the weekend. Other articles are seen by four or five editors before they're published. In general, though, articles go from reporter to assignment editor to at least one digital desk editor before being published.




How much manual labor is involved?



William Davis: We've managed to do away with pretty much all manual labor. Previously, all stories were written in our print CMS, and the web staff was responsible for copying and pasting the story into our web CMS, finding and adding links, writing a web headline and, quite often, doing that multiple times for the same story after it was updated. The copy editing was all print-centric, so at the end of the night, most of the stories would need to be updated. Now there's no copying and pasting — everything flows from one step to the next.



Related:


WordPress as Book Publishing Platform


 The line between book and Internet will disappear


 Metadata isn't a chore, it's a necessity


 Writing a Book with Google Docs



 The secret to digital publishing success? Don't start with the book




    
]]></description>
<dc:subject>Publishing cms newspapers workflow</dc:subject>
<dc:identifier>https://pinboard.in/u:anu/b:52bdadcab36f/</dc:identifier>
<taxo:topics><rdf:Bag>	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:Publishing"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:cms"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:newspapers"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:workflow"/>
</rdf:Bag></taxo:topics>
</item>
<item rdf:about="http://www.stickycomics.com/how-we-treat-our-computers/">
    <title>How We Treat Our Computers</title>
    <dc:date>2011-06-28T15:04:09+00:00</dc:date>
    <link>http://www.stickycomics.com/how-we-treat-our-computers/</link>
    <dc:creator>anu</dc:creator><description><![CDATA[Yep.


Update: Fireballed; cached here.



 ★ 
]]></description>
<dc:identifier>https://pinboard.in/u:anu/b:32a584c9903e/</dc:identifier>
</item>
<item rdf:about="http://www.smashingmagazine.com/2011/06/28/setup-a-ubuntu-vps-for-hosting-ruby-on-rails-applications-2/">
    <title>Setup A Ubuntu VPS For Hosting Ruby On Rails Applications</title>
    <dc:date>2011-06-28T11:54:58+00:00</dc:date>
    <link>http://www.smashingmagazine.com/2011/06/28/setup-a-ubuntu-vps-for-hosting-ruby-on-rails-applications-2/</link>
    <dc:creator>anu</dc:creator><description><![CDATA[



      
        
    



Let’s assume you have built a nice little Ruby on Rails application on your local development machine. Now it’s time for the application to go live. But where should you host this application? You know that you (or your client) do not have much money to spend, and so you look at the options. You notice right away that managed hosting of applications tends to be relatively expensive. Heroku is a good option, but it doesn’t give you storage space, and more importantly, it lacks full control. Luckily, you have a suitable alternative: a VPS.

This tutorial will help you get through the steps required to set up an Ubuntu VPS that is capable of hosting (multiple) Ruby on Rails applications. This tutorial builds on part 1, “Set Up An Ubuntu Local Development Machine For Ruby On Rails.” We recommend that you follow that part first and use the same Ubuntu local development machine that you set up there to walk through this part.



Wait… A VPS?
VPS stands for virtual private server. It is a virtual machine offered by Internet hosting companies. With a VPS, you get your own virtual slice of real estate that lives with other virtual slices on one physical server. This virtual machine is capable of running an operating system, a Web server and database software. A VPS comes with full control (or root access) and, with most hosting companies, at a very reasonable price. And because a VPS is capable of running multiple Ruby on Rails applications, the costs of the VPS can be spread.

Quick Overview
In this tutorial, we’ll log into the VPS, add a new user and configure SSH connections so that the VPS is more secure. Then, we’ll install Ruby and RubyGems using the Ruby Version Manager (RVM) script. In turn, we’ll install Rails and Capistrano using RubyGems. And then we’ll install Passenger and take care of the Nginx Web server installation. The VPS will also feature a PostgreSQL database.

At the time of writing, the latest versions are Ubuntu Server 10.10, Ruby 1.9.2 and Rails 3.0.7. These steps were also tested on Ubuntu Server 10.04 and the upcoming Ubuntu Server 11.04 release.

During this tutorial, we will make extensive use of the Linux command line. A short glossary at the end of this tutorial describes the relevant Linux commands.

Up And Running
First, find a suitable host and purchase your VPS (if you don’t have one already). Make sure the host allows you to install Ubuntu on a VPS; most hosting companies will because it is a popular choice for VPS’. I chose a 512 MB VPS, which should be sufficient to run multiple small Ruby on Rails applications.

For those without a VPS, you can still follow along using virtualization software like VirtualBox. VirtualBox is open-source software and available in the Ubuntu Software Center or via the official website. Make sure when setting up your virtual machine that your network adapter is set to “Bridged” (Right click → Settings → Network → Attached to: Bridged Adapter). This way, your virtual machine will get its own IP address on your local network. Just install a fresh copy of Ubuntu Server, select “OpenSSH server” during installation, and skip the next two steps. You can log in directly via the VirtualBox window or, if you know the IP address of the server, via SSH.

Log into your VPS host’s control panel, and install a fresh copy of Ubuntu Server. Make sure to submit a safe “root” password, and boot the VPS.

Log Into Your VPS
We’ll log into our VPS using SSH. SSH stands for secure shell and is a network protocol. It enables computers to communicate via an encrypted connection.

I assume you know the IP address of your VPS (if not, look it up in your host’s control panel), and that “root” is the default user, and that you know the “root” password, and that SSH is installed.

While using the domain name of the VPS is technically possible, we will log in using the VPS’ IP address. Setting up the domain name of your VPS is very context-specific and beyond the scope of this tutorial.

Now open up a terminal window on your Ubuntu local development machine, and log into your VPS:


$ ssh default-user@vps-ip-address

For example:


$ ssh root@123.456.7.890

You might have to type yes and then provide the “root” password. In about a second, you should be logged in.

Secure Your VPS
For security reasons, you should do as little as possible as “root.” So, we’ll create a new user and assign administrative rights to it. To make use of its administrative rights, the user needs to explicitly invoke the “sudo” command, which adds a security layer to the system administration. First, create a new user:


$ adduser your-user-name

For example:


$ adduser johndoe

Provide a safe password (filling in the user details is optional). Now, make the new user a member of the “admin” group, which grants the user administrative rights (by invoking the sudo command).


$ adduser your-user-name group-name

For example:


$ adduser johndoe admin

Securing your SSH (server) configuration is the next step. Because every Unix system has a “root” user by default, you should disable “root” from logging in using SSH. This makes your system less vulnerable to brute force attacks.


$ nano /etc/ssh/sshd_config

Set PermitRootLogin to no, and reload the SSH configuration so that the changes take effect. Although “root” will be disabled from logging in in future, the current “root” user connection will be maintained.


$ /etc/init.d/ssh reload

Now, log out of your VPS as “root,” and log back in as the new user.


$ logout
$ ssh your-user-name@vps-ip-address

For example:


$ ssh johndoe@123.456.7.890

The system is more secure now that a new user has been created and “root” has been disabled from logging in via SSH. Some of the upcoming steps repeat the steps we took in part 1 of this tutorial, while also getting us up to date and installing RVM, Ruby, RubyGems and Rails.

Get Up To Date
Now, let’s get up to date. The first three commands below will, in turn, update the package lists, upgrade currently installed packages, and install new packages and delete obsolete packages. You’ll end up with a VPS that is fully up to date. The final command will reboot the VPS, which is good practice after updating a lot of packages.


$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get dist-upgrade
$ sudo reboot

Prepare Your VPS For RVM
Wait a minute or so for the VPS to reboot. Once it has, log back into the VPS from a terminal window.


$ ssh your-user-name@vps-ip-address

For example:


$ ssh johndoe@123.456.7.890

The RVM script needs some packages in order to be installed, namely Curl and Git. Curl is a tool to transfer data using a range of protocols (such as HTTP and FTP). And Git is “a free and open-source, distributed version control system designed to handle everything from small to very large projects with speed and efficiency.” Git is the choice for version control among most Ruby on Rails developers.


$ sudo apt-get install curl
$ sudo apt-get install git-core

Install RVM
Now we can install RVM. RVM stands for Ruby Version Manager and is “a command line tool that allows you to easily install, manage and work with multiple Ruby environments, from interpreters to sets of Gems.” The following command takes care of installing the script. RVM will be installed in the home directory of the currently logged-in user:


$ bash < <(curl -s https://rvm.beginrescueend.com/install/rvm)



Navigate to the home directory, and edit the user’s bash profile. This ensures that the RVM script is loaded every time the corresponding user logs in. To edit the bash profile, we use Nano. Nano is a simple command line text editor, and we will use it again in this tutorial.


$ cd
$ nano .bashrc

Add the following line to the end of the user’s bash profile.


[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm"

Load the script into the current shell session by reloading the user’s bash profile. This way, the rvm command will be made available.


$ source .bashrc

You can verify whether the RVM script is working by entering the following command:


$ type rvm | head -1

If everything is set up correctly, the shell should return that “rvm is a function.” If it doesn’t, please go over to the RVM website and look under “Troubleshooting Your Install” to see how to make it work.

Prepare Your VPS For Ruby And RubyGems
RVM comes with a handy tool for seeing the dependencies needed to compile and install Ruby and RubyGems from source.


$ rvm notes

Look at the dependencies listed under the regular version of Ruby, and install these. Some packages might already be installed.


$ sudo apt-get install build-essential bison openssl
libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev
libssl-dev libyaml-dev libsqlite3-0 libsqlite3-dev sqlite3
libxml2-dev libxslt-dev autoconf libc6-dev ncurses-dev

Install Ruby And RubyGems Using RVM
On the one hand, we have Ruby. It is “a dynamic, open-source programming language with a focus on simplicity and productivity. It has an elegant syntax that is natural to read and easy to write.”

On the other hand, we have RubyGems. It is “the premier Ruby packaging system. It provides a standard format for distributing Ruby programs and libraries, an easy to use tool for managing the installation of Gem packages, a Gem server utility for serving Gems from any machine where RubyGems is installed, and a standard way of publishing Gem packages.”

Like the RVM command described above, there is also a command to see what versions of Ruby are available to install using RVM. Have a look at the available Ruby versions.


$ rvm list known

Install a regular version of Ruby. Because Ruby gets compiled from source, this might take a while.


$ rvm install 1.9.2



Start using the installed Ruby, and set this version as the default.


$ rvm --default use 1.9.2

Check the Ruby and RubyGems versions to see whether they have been properly installed.


$ ruby -v
$ gem -v

If necessary, manually updating RubyGems and the Gems is possible.


$ gem update --system
$ gem update

Install Rails Using RubyGems
Rails Gem itself is the only thing left to put on Ruby on Rails. Installing this is one of the easiest parts of this tutorial. It is installed using RubyGems, invoked by the gem command. When the installation finishes, check the Rails version to see whether Rails has been properly installed.


$ gem install rails
$ rails -v



Install Passenger Using RubyGems
Phusion Passenger “makes deployment of Ruby Web applications, such as those built on the revolutionary Ruby on Rails Web framework, a breeze.” It is a module for running Ruby on Rails applications in conjunction with a Web server such as Nginx.

You can install Passenger using RubyGems and then check the Passenger version to see whether Passenger has been properly installed.


$ gem install passenger
$ passenger -v

Install Nginx, And Configure The Passenger Module
Nginx, pronounced “engine x”, is “an HTTP and reverse proxy server, as well as a mail proxy server.” To put it simply, it is a versatile Web server that is low on resources.



In order to let Passenger install Nginx, you need to install a dependency first.


$ sudo apt-get install libcurl4-openssl-dev

You can start installing Nginx and configuring the Passenger module by using the following command. Notice that we use rvmsudo instead of sudo, because the regular sudo does not work on this little program.


$ rvmsudo passenger-install-nginx-module

The program will check the dependencies first and then ask whether you want the program to download the Nginx source code or to download it yourself. Choose option 1 (have the program download the Nginx source code for you), and hit “Enter.” You can leave everything in the default settings, so just make your way through the installation process.

In the end, you will be presented with two screens. The first shows how to configure Nginx to work with Passenger; this was already done by the program. The second shows how to configure Nginx to deploy an application. We will come back to this example later in the tutorial.

You could start Nginx by hand…


$ sudo /opt/nginx/sbin/nginx

… but using a start-up script is preferable. (Because Nginx gets compiled from source, it does not come with a start-up script.) With a start-up script, we can not only start Nginx, but also stop, reload and restart it. In addition, Nginx will be started automatically if the VPS reboots unexpectedly. Therefore, we need to download a little start-up script for Nginx to the home directory using Wget. Wget is a simple command line program that enables us to download files from the Internet. You do not need to understand the rest of the commands. They simply move the script to the right location, make it executable and make sure that Nginx starts when the system boots.


$ cd
$ wget http://www.smashingmagazine.com/files/nginx
$ sudo mv nginx /etc/init.d/nginx
$ sudo chmod +x /etc/init.d/nginx
$ sudo /usr/sbin/update-rc.d -f nginx defaults

From now on, the following commands can be used to start, stop, reload and restart Nginx.


$ sudo /etc/init.d/nginx start
$ sudo /etc/init.d/nginx stop
$ sudo /etc/init.d/nginx reload
$ sudo /etc/init.d/nginx restart

Install PostgreSQL
PostgreSQL is “a sophisticated object-relational DBMS, supporting almost all SQL constructs, including subselects, transactions and user-defined types and functions.”

Install PostgreSQL together with a dependency. This dependency will be needed to install the “pg” Gem later on, which is responsible for the connection between PostgreSQL and Ruby on Rails.


$ sudo apt-get install postgresql libpq-dev

Configure PostgreSQL
When the packages have been installed, move on to configuring PostgreSQL by securing psql. psql is the PostgreSQL interactive terminal, and it is used for administrative database tasks.

By default, you do not need a password to log into psql. We’ll change this by editing the authentication method and then reloading the PostgreSQL configuration. But first, assign a password to superuser “postgres”. Log into psql, assign a safe password to “postgres,” and then log out of psql.


$ sudo -u postgres psql
# \password postgres
# \q

Now change the authentication configuration by changing ident to md5. This ensures that a password is needed to log into psql and that the password is encrypted. The two relevant lines, which need to be edited, can be found near the end of the configuration file. After that, reload the changed configuration into PostgreSQL.


$ sudo nano /etc/postgresql/8.4/main/pg_hba.conf
$ sudo /etc/init.d/postgresql reload

Most other PostgreSQL settings are stored in another configuration file. These settings can also be optimized, but that is beyond the scope of this tutorial. Keep in mind that the PostgreSQL configuration needs to be reloaded in order for the changes to take effect.


$ sudo nano /etc/postgresql/8.4/main/postgresql.conf

The VPS is now installed. You can log out.


$ logout

Testing The VPS
To make sure everything works, we’ll develop a very small application on the local development machine and deploy it to the VPS using Capistrano. This process consists of the following steps:


Open two terminal windows, one for the local development machine and one for the VPS.
Log into the VPS using SSH (VPS).
Create a database user for the test application (VPS).
Create a database for the test application (VPS).
Create a test application using PostgreSQL as the database (local).
Configure the database connections for the test application (local).
Generate a simple scaffold for the test application (local).
Initialize Git as version control for the test application (local).
Add all the files of the test application to the Git version control list (local).
Take a version snapshot of the current application using Git (local).
Initialize Capistrano as a deployment tool for the test application (local).
Remove the default Capistrano deployment configuration file, and create a new one (local).
Set up the VPS to deploy the test application using Capistrano (local).
Check the VPS set-up for deploying the test application using Capistrano (local).
Deploy the test application with Capistrano (local).
Edit the Nginx configuration to work with the test application (VPS).
Reload Nginx (VPS).
Check the test application in a Web browser (local).

Once we have verified that everything works, we’ll go through the following steps:


Delete the database for the test application (VPS).
Delete the database user for the test application (VPS).
Restore the default Nginx configuration (VPS).
Reload Nginx (VPS).
Remove the test application (VPS).
Log out of the VPS (VPS).
Remove the test application (local).
Close both terminal windows.

Unlike part 1 of this tutorial, some of these steps have to be performed on the local development machine, and other steps have to be performed on the VPS. Therefore, we will open two terminal windows on our local development machine: one for the local development machine itself, and one with a connection to the VPS. The conventions used to test the VPS are shown below in Box 2.1. The database user name and the database name are derived from the name of the application.


Box 2.1

Name of the application: test_app

Name of the VPS database user: test_app

Password of the VPS database user: banana

Name of the VPS database: test_app_production

Name of the VPS system user: johndoe

VPS IP address: 123.456.7.890


Now open two terminal windows, one for the local development machine and one for the VPS. Log into the VPS using SSH:


$ ssh johndoe@123.456.7.890 (VPS)

When applications are deployed to a (publicly accessible) VPS, creating a new database user for every single application is good practice. This way, you will prevent multiple applications from viewing, inserting, editing and deleting data from and to each other’s databases, and thus increase security.

Let’s create a database user for the test application using the createuser command. We are using “postgres” as administrator (or superuser) for PostgreSQL. The P flag enables us to provide a password. The > sign stands for the questions that will be prompted.


$ sudo -u postgres createuser -P (VPS)
> Enter name of role to add: test_app
> Enter password for new role: banana
> Enter it again: banana
> Shall the new role be a superuser? (y/n) n
> Shall the new role be allowed to create databases? (y/n) n
> Shall the new role be allowed to create more new roles? (y/n) n
> Password: your-postgres-user-password

Then, create a database for the test application that is owned by the test application user. While you can use Rake to create a database, we will use PostgreSQL so that we can learn some basic PostgreSQL administration.

You can create a new database by invoking the createdb command in conjunction with the O flag, the database user name and the new database name itself. The production that we append to the end of the database name is the default name. Here, you will be prompted for the PostgreSQL superuser password again.


$ sudo -u postgres createdb -O test_app test_app_production (VPS)
> Password: your-postgres-user-password

Now that the database has been set up, it is time to create the actual Ruby on Rails application on your local development machine.

Navigate to your home directory, and create a new Rails application, named test_app and using PostgreSQL as the database back end. The d flag enables you to specify your preferred database software.


$ cd (LOCAL)
$ rails new test_app -d postgresql (LOCAL)

Go into the Rails application directory. Use Nano to edit the database configuration file by adding banana as a password in the production database configuration. Because we have followed the conventions described in Box 2.1, the database user name and the database name have already been taken care of.


$ cd test_app (LOCAL)
$ nano config/database.yml (LOCAL)

Now, generate a basic scaffold. Programming in Rails is beyond the scope of this tutorial, but this command will create a “User” model and a “users” controller. The inputs will consist of a name and an email address, which are both strings in the PostgreSQL database.


$ rails generate scaffold User name:string email:string (LOCAL)

Remember when we set up Git in part 1 of this tutorial? Now we’re finally going to use it. We will initialize Git as version control for the test application, add all of the files from the test application to the Git version control list (recursively), and take a version snapshot of the current application using Git. The m flag lets us add a short description of the snapshot.


$ git init (LOCAL)
$ git add . (LOCAL)
$ git commit -m “First commit” (LOCAL)

By now, it is time to deploy the application to the VPS, which we will do using Capistrano.

Initialize Capistrano as a deployment tool for the test application. This will create several files in your Ruby on Rails application directory. Remove the default Capistrano deployment configuration file, and create a new one. The contents of the new Capistrano configuration file can be found in Box 2.2 below.


$ capify . (LOCAL)
$ rm config/deploy.rb (LOCAL)
$ nano config/deploy.rb (LOCAL)


Box 2.2

# RVM

$:.unshift(File.expand_path('./lib', ENV['rvm_path']))
require "rvm/capistrano"
set :rvm_ruby_string, 'default'
set :rvm_type, :user

# Bundler

require "bundler/capistrano"

# General

set :application, "test_app"
set :user, "johndoe"

set :deploy_to, "/home/#{user}/#{application}"
set :deploy_via, :copy

set :use_sudo, false

# Git

set :scm, :git
set :repository,  "~/#{application}/.git"
set :branch, "master"

# VPS

role :web, "123.456.7.890"
role :app, "123.456.7.890"
role :db,  "123.456.7.890", :primary => true
role :db,  "123.456.7.890"

# Passenger

namespace :deploy do
 task :start do ; end
 task :stop do ; end
 task :restart, :roles => :app, :except => { :no_release => true } do
   run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}"
 end
end


Use the cap command to set up the VPS in order to deploy the test application using Capistrano. This will set up some directory structures on your VPS.

When using the cap command, you will need to provide a password when prompted. This is the password of the VPS user that you created at the very beginning of this tutorial. Check the VPS set-up for deploying the test application using Capistrano, and finally, deploy the test application.

Executing the last command might take a while because it installs the required Gems on the VPS and takes care of the database migrations (if there are any). Here you really see the benefit of Capistrano, because it automates tasks such as uploading the latest version of your application, installing the required Gems and performing the database migrations.


$ cap deploy:setup (LOCAL)
$ cap deploy:check (LOCAL)
$ cap deploy:cold (LOCAL)

The last thing to do is tell Nginx where the Ruby on Rails test application is located. So, we need to edit the Nginx configuration file.

An example of the changes you have to make to that file are shown in Box 2.3 below. Only an excerpt of the relevant lines is printed here. Make sure to comment out the last four lines of the excerpt using #. Once you have made the changes, reload the new configuration into Nginx.


$ sudo nano /opt/nginx/conf/nginx.conf (VPS)
$ sudo /etc/init.d/nginx reload (VPS)


Box 2.3

(…)


server {
   listen 80;
   server_name www.yourdomain.com;
   root /home/johndoe/test_app/current/public;
   passenger_enabled on;

   #charset koi8-r;

   #access_log  logs/host.access.log  main;

   #location / {
   #    root   html;
   #    index  index.html index.htm;
   #}

(…)


When the deployment and Nginx configuration are done, check the application in a Web browser. Navigate to http://your-vps-ip-address/. The link to the application’s environment will not work in production mode.



After that, look at http://your-vps-ip-address/users. Create, edit, view and delete some users:



If everything has worked, then the test application database and the test application database user can be removed. The dropdb command removes a PostgreSQL database.


$ sudo -u postgres dropdb test_app_production (VPS)
> Password: your-postgres-user-password

The dropuser command removes a PostgreSQL user.


$ sudo -u postgres dropuser (VPS)
> Enter name of role to drop: test_app
> Password: your-postgres-user-password

Restore the Nginx configuration by copying an example of the (default) Nginx configuration file, overwriting the modified one, and then reload Nginx.


$ sudo cp /opt/nginx/conf/nginx.conf.default /opt/nginx/conf/nginx.conf (VPS)
$ sudo /etc/init.d/nginx reload (VPS)

When that is done, navigate to your home directory on the VPS, and recursively remove the test application.


$ cd (VPS)
$ rm -rf test_app (VPS)

Finally, log out of the VPS.


$ logout (VPS)

For the local development machine, we also need to navigate to the home directory and recursively remove the test application. When all of the commands below are entered, you can close both terminal windows. This leaves you with a fresh VPS and local development machine ready for developing and deploying Ruby on Rails applications.


$ cd (LOCAL)
$ rm -rf test_app (LOCAL)

Appendix
Linux Command Line Glossary
The Linux commands used in this tutorial are described here. The list is in alphabetical order and features only the relevant Linux commands. A Linux command usually takes the form of command -option(s) argument(s). For example, rm -r test_app. For a more detailed description, use the manual, which can be accessed using man [command].


sudo [command]
Executes a command as an administrative user.
adduser [username]
Adds a user to the system.
adduser [username] [groupname]
Adds a user to a specific group.
apt-get dist-upgrade
In addition to performing upgrades, this is used to intelligently handle dependencies.
apt-get install [package]
Installs (or upgrades) packages.
apt-get update
Resynchronize the package index files from their sources.
apt-get upgrade
Installs the newest versions of all packages currently installed.
bash < <( curl [location] )
A combination of commands used to both obtain and execute a script (from the Internet).
cd [location]
Changes the current working directory. Without an argument, it goes to the user’s home.
cp [file] [location]
Copies a file to the specified location (overwriting the existing file silently).
chmod +x [file]
Makes a file exexutable.
logout
Logs out of a shell or SSH session.
mv [file] [location]
Moves a file to another location.
nano [file]
Used to edit configuration files.
reboot
Reboots the system.
rm [file]
Removes a file.
rm -rf [directory]
Removes a directory (recursively and forced, so it will not prompt).
source [script]
Forces bash to read the specified script.
ssh [username@ipaddress]
Logs into a secure shell session.
type [command]
Displays the kind of command that the shell will execute.
wget [location]
Obtains a file from the Internet.

Resources

Ubuntu
RVM
Ruby
RubyGems
Rails
Passenger
Nginx
PostgreSQL
Capistrano
Git

Further Learning

The Linux Command Line
The Linux Command Line Book
Ubuntu Server Guide
Ruby on Rails Guides
Ruby on Rails Tutorial
Ruby on Rails Tutorial Book
Git Community Book
Pro Git
Git Reference

(al) (kw)


© David Boot for Smashing Magazine, 2011.
]]></description>
<dc:subject>Coding Linux</dc:subject>
<dc:identifier>https://pinboard.in/u:anu/b:86c14323d0cf/</dc:identifier>
<taxo:topics><rdf:Bag>	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:Coding"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:Linux"/>
</rdf:Bag></taxo:topics>
</item>
<item rdf:about="http://www.digital-photography-school.com/6-winning-ways-to-work-wide">
    <title>6 Winning Ways to Work Wide</title>
    <dc:date>2011-06-26T19:01:24+00:00</dc:date>
    <link>http://www.digital-photography-school.com/6-winning-ways-to-work-wide</link>
    <dc:creator>anu</dc:creator><description><![CDATA[Today Joe Decker shares some tips on wide angle photography.

One of the first lens purchases aspiring landscape photographers typically made is a wide or super-wide lens, anything (in full-frame 35mm terms) from 24mm on down, and with good reason, wides offer photographers the ability to capture the sweeping vistas of the natural landscape. But they can also be a challenge to use effectively, it’s all to easy to end up with a wide-angle shot that lacks the power and grandeur we felt when we were shooting. In this article, I’ll explain why that’s so often the case, and provide a few tips for working around those challenges, showing you how to use wide-angle lenses to create dramatic, effective images.

Nordenskjöld Lake, Torres Del Paine National Park, Chile. Image Copyright Joe Decker


1. Get Close!
Because wide-angle lenses take in a bigger angle-of-view than other lenses, using a wide-angle lens at the same distance from your subject will render that subject smaller than it would otherwise. To compensate for this, you’ll have to move closer to your subject. Don’t be bashful about getting close, particularly with super-wides&mash;it’s almost impossible to get “too close” to your subject with a 14mm lens. This emphasis in size that wide-angle lenses give nearby objects means that …

2. It’s All about the Foreground
Contrary to what you might expect, this means that the most important element of your wide-angle landscapes is the foreground. While wide-angle lenses do capture the wider landscape, they also (almost inevitably, because of their wide field-of-view) capture quite a bit of foreground as well, and this foreground is emphasized by the wide-angle perspective. As a result, if your foreground isn’t interesting, your photograph won’t be interesting. This leads us naturally to the Josef Muench idea of the near-far composition, an image which uses a wide-angle lens to not only show a broad vista, but also to show one detail of that landscape in an up-close, intimate way. When you’re photographing wide, be sure to spend some time looking for the most interesting foreground available to combine with your grand vista.  (If there isn’t an interesting foreground, you might want to consider using a longer lens to leave out that less interesting foreground.)

 Fallen Redwoods, Stout Grove, Jedediah Smith State Park, California.  Image Copyright Joe Decker



3. Watch those Verticals!
Wide-angle lenses tend to bend and distort verticals, as you can see in the tree trunks near the top of Fallen Redwoods. Now, you might decide you like that effect, or that you hate it, but it’s important to be aware of it and to make a conscious decision about it. For some images it’s fun to embrace, but more often I find myself having to work to avoid it or correct it later.  Avoiding it can be as simple a matter as composing so that there’s only a single obvious vertical (and that that’s vertical), alternatively, using shift movements with a tilt-shift lens can correct some of this distortion in-camera. Post-exposure, Photoshop’s “Lens Distort” filter can also save the day.

4. Leading Lines
Compositionally, lines (such as streams or railway tracks) leading from the bottom corners of an image towards the center often have a particular magic for guiding the viewers eye through the picture, making for strong images, and this is particularly the case for wide-angle images. Hot Stream is a great example of this, the viewers eye tends to wander from the corner  back through the image along the stream. As the stream moves back into the image, the stream gets smaller (in terms of inches on the printed page) quickly due the wide perspective. This quick fade (in width) into the distance creates a real sense of depth in the image.

Hot Stream, Húsavík, Iceland.   Image Copyright Joe Decker

5. Filter Woes
Shooting wide creates two problems for those of us who use filters. Polarizers are a specific problem, the effect of a polarizer on a blue sky varies across the sky so greatly that wide-angle images including the sky are left horribly unnatural, so leave off the polarizer unless you know there’s no blue sky in your scene. Screw-in filters are a separate problem, it’s all too easy for the filter edges, particularly if you’re stacking more than one filter on the same lens. Filter systems, such Cokin’s P-series filters (with the wide-angle filter holder), can help you avoid these problems if you must use filters.

Dwarf Arctic Birch, C. Hofmann Peninusla, Greenland.  Image Copyright Joe Decker

6. Focusing
One of the things I enjoy most about working with wide-angle lenses is the ease of focusing them. As you move to wider and wider focal lengths, the depth-of-field at a particular aperture gets deeper and deeper. This allows you to make great use of the concept of hyperfocal distance, that is, the nearest distance you can focus a particular lens at a particular aperture and get “good focus”. At 24mm, by focusing about six feet out from the camera you’ll capture everything from about three feet to infinity in focus—even at f/11. At 17mm, focusing at the right point at f/11 will get you everything from infinity down to 17 inches away. Find (using a web site like this or any of a number of other sites, software tools or printed tables) and write down the hyperfocal distance for a couple of your widest lenses at a couple of your favorite apertures, and you’ll have an easy way of bringing the entire scene of near-far compositions into critical focus.

Using wide-angle lenses can certainly be tricky, but I love them all the same. Used well they can allow the photographer to create images that immerse us in a world with both small, intimate details and bold, dramatic vistas.

Joe Decker is a professional nature photographer and writer for Photocrati’s Photography Blog He also offers nature photography workshops and coaching around the western United States.

Post from: Digital Photography School's Photography Tips. Check out our resources on Portrait Photography Tips, Travel Photography Tips and Understanding Digital Cameras.



6 Winning Ways to Work Wide



   

]]></description>
<dc:subject>Featured</dc:subject>
<dc:identifier>https://pinboard.in/u:anu/b:3651ecd732ca/</dc:identifier>
<taxo:topics><rdf:Bag>	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:Featured"/>
</rdf:Bag></taxo:topics>
</item>
<item rdf:about="http://radar.oreilly.com/2011/06/9-digital-book-tools.html">
    <title>9 digital book-making tools</title>
    <dc:date>2011-06-23T16:00:00+00:00</dc:date>
    <link>http://radar.oreilly.com/2011/06/9-digital-book-tools.html</link>
    <dc:creator>anu</dc:creator><description><![CDATA[This is part of an ongoing series related to Peter Meyers' project "Breaking the Page, Saving the Reader: A Buyer & Builder's Guide to Digital Books." We'll be featuring additional material in the weeks ahead. (Note: This post originally appeared on A New Kind of Book. It's republished with permission.)




I'm looking forward to the free webcast I'm giving next Thursday on digital book-making tools (June 30th; sign-up info here) . There's quite a land grab happening right now, as software manufacturers — new and old — try to become the tool of choice for authors, small publishers, and illustrators. I still haven't finalized exactly which software I'll be talking about, but now seemed like a good time to share a selection of my research notes.




Demibooks Composer



iPad-based app gives authors a touchscreen-based development   tool from which they can create an iPad app. You can do things like move   objects to indicate motion paths. Ideal for kids' books with lots of   illustrations. In private beta, planned release later this summer.




My Story Book for the iPad



Like Composer, this app lets you create kids books on the iPad   itself — though with fewer interactive and motion capabilities. Includes   basic tools for adding and manipulating text atop photos and illustrations.   Beta launching this summer.




Aquafadas



Plug-in tool lets you add interactive and multimedia   enhancements to InDesign or Quark layouts. Good for complex layouts featuring   a mix of text and images. In limited pre-release.




Active Reader



Plug-in for Unity (high-powered game development program).   Flowchart-like user interface lets you program interactivity and motion;  especially useful for highly illustrated books like graphic novels.




Atavist's Periodic Technology



Authoring tool lets you add "Inline Extras" (e.g. pop-up   character summaries, timelines, maps) to long-form articles that The Atavist   specializes in (longer than an article, shorter than a book, they say).   Export options include iOS app and stripped down Kindle files. Tool currently   in private beta.




Moglue



Desktop app (Mac or Win) for creating interactive iOS and   Android ebooks, especially illustration-rich kids books. Open beta starting   in July according to their Twitter account.




InteractBuilder



Desktop app (Mac or Win) lets kids book authors create   iOS interactive ebooks.




App Press



Web-based tool for creating iOS apps. Early uses include photo   histories and cookbooks. Web-based preview tool lets you share in-progress   designs. Developer provides InDesign and Photoshop templates for preparing   assets before importing into the App Press tool.




Leanpub



Lets you use pretty much any blogging tool to   publish an ebook. System accepts RSS feeds, HTML, or Markdown and outputs   ePub 2.1, Mobi and PDF. Built-in e-commerce system takes care of sales for   author and offers very generous royalty rates (usually about 90%).


This is by no means an exhaustive list. I've looked at, easily, a couple dozen entrants and the ones listed above are mainly there because my notes on them are ready for sharing. My goal for the webcast is to give attendees a guided tour of the main kinds of tools out there, with a look at what feels to me like the most promising tools in each category. Hope you can join in!


Webcast: Digital Bookmaking Tools Roundup — Pete Meyers looks at the growing number of digital book tools: what's best, what's easiest to use, and what's worth putting in your book-building toolkit. 
Join us on Thursday, June 30, 2011, at 10 am PT
 
Register for this free webcast



Related:


 10 innovative digital books you should know about
 More stories from the "Breaking the Page" project




    
]]></description>
<dc:subject>Publishing apps</dc:subject>
<dc:identifier>https://pinboard.in/u:anu/b:b0052a5612df/</dc:identifier>
<taxo:topics><rdf:Bag>	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:Publishing"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:apps"/>
</rdf:Bag></taxo:topics>
</item>
<item rdf:about="http://www.smashingmagazine.com/2011/06/22/following-a-web-design-process/">
    <title>Following A Web Design Process</title>
    <dc:date>2011-06-22T13:42:20+00:00</dc:date>
    <link>http://www.smashingmagazine.com/2011/06/22/following-a-web-design-process/</link>
    <dc:creator>anu</dc:creator><description><![CDATA[




      
        
    



Almost every Web designer can attest that much of their work is repetitive. We find ourselves completing the same tasks, even if slightly modified, over and over for every Web project. Following a detailed website design and development process can speed up your work and help your client understand your role in the project. This article tries to show how developing a process for Web design can organize a developer’s thoughts, speed up a project’s timeline and prepare a freelance business for growth.

First of all, what exactly is a ‘process’? A Web development process is a documented outline of the steps needed to be taken from start to finish in order to complete a typical Web design project. It divides and categorizes the work and then breaks these high-level sections into tasks and resources that can be used as a road map for each project.

A Typical Process
Here is a standard process that was put together using examples from around the Web as well as my own experience. (Note: Please see the resource links at the end of each phase.)

1. Planning
The planning stage is arguably the most important, because what’s decided and mapped here sets the stage for the entire project. This is also the stage that requires client interaction and the accompanying attention to detail.


Requirements analysis
This includes client goals, target audience, detailed feature requests and as much relevant information as you can possibly gather. Even if the client has carefully planned his or her website, don’t be afraid to offer useful suggestions from your experience.
Project charter
The project charter (or equivalent document) sums up the information that has been gathered and agreed upon in the previous point. These documents are typically concise and not overly technical, and they serve as a reference throughout the project.
Site map
A site map guides end users who are lost in the structure or need to find a piece of information quickly. Rather than simply listing pages, including links and a hierarchy of page organization is good practice.
Contracts that define roles, copyright and financial points
This is a crucial element of the documentation and should include payment terms, project closure clauses, termination clauses, copyright ownership and timelines. Be careful to cover yourself with this document, but be concise and efficient.
Gain access to servers and build folder structure
Typical information to obtain and validate includes FTP host, username and password; control panel log-in information; database configuration; and any languages or frameworks currently installed. 
Determine required software and resources (stock photography, fonts, etc.)
Beyond determining any third-party media needs, identify where you may need to hire sub-contractors and any additional software you may personally require. Add all of these to the project’s budget, charging the client where necessary.

Resource links for this phase:


Jumpchart: Client/developer collaboration tool
Dropbox: File-sharing and collaboration tool
Mindmeister: Free online mind-mapping software
Writing Bulletproof Web Design Contracts



2. Design
The design stage typically involves moving the information outlined in the planning stage further into reality. The main deliverables are a documented site structure and, more importantly, a visual representation. Upon completion of the design phase, the website should more or less have taken shape, but for the absence of the content and special features.


Wireframe and design elements planning
This is where the visual layout of the website begins to take shape. Using information gathered from the client in the planning phase, begin designing the layout using a wireframe. Pencil and paper are surprisingly helpful during this phase, although many tools are online to aid as well.
Mock-ups based on requirements analysis
Designing mock-ups in Photoshop allows for relatively easy modification, it keeps the design elements organized in layers, and it primes you for slicing and coding when the time later on.
Review and approval cycle
A cycle of reviewing, tweaking and approving the mock-ups often takes place until (ideally) both client and contractor are satisfied with the design. This is the easiest time to make changes, not after the design has been coded.
Slice and code valid XHTML/CSS
It’s coding time. Slice the final Photoshop mock-up, and write the HTML and CSS code for the basic design. Interactive elements and jQuery come later: for now, just get the visuals together on screen, and be sure to validate all of the code before moving on.

Resource links for this phase:


Printable Sketch Templates for Wireframing
Color Scheme Designer
Type Tester, font comparison
iPlotz, online template and wireframing tool
Stripe Generator
Favicon Generator
Icon Finder
Stock Exchange, free stock photos

3. Development
Development involves the bulk of the programming work, as well as loading content (whether by your team or the client’s). Keep code organized and commented, and refer constantly to the planning details as the full website takes shape. Take a strategic approach, and avoid future hassles by constantly testing as you go.


Build development framework.
This is when unique requirements might force you to diverge from the process. If you’re using Ruby on Rails, an ASP/PHP framework or a content management system, now is the time to implement it and get the basic engine up and running. Doing this early ensures that the server can handle the installation and set-up smoothly.
Code templates for each page type.
A website usually has several pages (e.g. home, general content, blog post, form) that can be based on templates. Creating your own templates for this purpose is good practice.
Develop and test special features and interactivity.
Here’s where the fancy elements come into play. I like to take care of this before adding the static content because the website now provides a relatively clean and uncluttered workspace. Some developers like to get forms and validation up and running at this stage as well.
Fill with content.
Time for the boring part: loading all of the content provided by the client or writer. Although mundane, don’t misstep here, because even the simplest of pages demand tight typography and careful attention to detail.
Test and verify links and functionality.
This is a good time for a full website review. Using your file manager as a guide, walk through every single page you’ve created—everything from the home page to the submission confirmation page—and make sure everything is in working order and that you haven’t missed anything visually or functionally.

Resource links for this phase:


Wufoo, form generator
Adobe Browserlab, cross-browser analysis
Choosing the Right Web Platform



4. Launch
The purpose of the launch phase is to prepare the website for public viewing. This requires final polishing of design elements, deep testing of interactivity and features and, most of all, a consideration of the user experience. An important early step in this phase is to move the website, if need be, to its permanent Web server. Testing in the production environment is important because different servers can have different features and unexpected behavior (e.g. different database host addresses).


Polishing
Particularly if you’re not scrambling to meet the deadline, polishing a basically completed design can make a big difference. Here, you can identify  parts of the website that could be improved in small ways. After all, you want to be as proud of this website as the client is.
Transfer to live server
This could mean transferring to a live Web server (although hopefully you’ve been testing in the production environment), “unhiding” the website or removing the “Under construction” page. Your last-minute review of the live website happens now. Be sure the client knows about this stage, and be sensitive to timing if the website is already popular.
Testing
Run the website through the final diagnostics using the available tools: code validators, broken-link checkers, website health checks, spell-checker and the like. You want to find any mistakes yourself rather than hearing complaints from the client or an end-user.
Final cross-browser check (IE, Firefox, Chrome, Safari, Opera, iPhone, BlackBerry)
Don’t forget to check the website in multiple browsers one last time. Just because code is valid, doesn’t mean it will sparkle with a crisp layout in IE 6.

Resource links for this phase:


W3C Validation (HTML, CSS)
Adobe Browserlab, cross-browser analysis

5. Post-Launch
Business re-enters the picture at this point as you take care of all the little tasks related to closing the project. Packaging source files, providing instructions for use and any required training occurs at this time. Always leave the client as succinctly informed as possible, and try to predict any questions they may have. Don’t leave the project with a closed door; communicate that you’re available for future maintenance and are committed to ongoing support. If maintenance charges haven’t already been shared, establish them now.


Hand off to client
Be sure the client is satisfied with the product and that all contractual obligations have been met (refer to the project charter). A closed project should leave both you and the client satisfied, with no burned bridges.
Provide documentation and source files
Provide documentation for the website, such as a soft-copy site map and details on the framework and languages used. This will prevent any surprises for the client later on, and it will also be useful should they ever work with another Web developer.
Project close, final documentation
Get the client to sign off on the last checks, provide your contact information for support, and officially close the project. Maintain a relationship with the client, though; checking in a month down the road to make sure everything is going smoothly is often appreciated.

As stated, this is merely a sample process. Your version will be modified according to your client base and style of designing. Processes can also differ based on the nature of the product; for example, e-commerce websites, Web applications and digital marketing all have unique requirements.



Documenting The Process
Create and retain two versions of your Web design process:
One for you or your team to use as a guide as you work on the back end, and one to share with clients. The differences between the two should be intrinsically clear: yours would be much more detailed and contain technical resources to help with development; the client’s would be a concise, non-technical map of the process from start to finish.

Common tools for documenting the business process are a simple Microsoft Word document, Microsoft Visio and mind-mapping software such as Freemind. If you’re ambitious, you could even develop your own internal Web-based tool.

Using The Process
By now, you should understand what a process looks like, including the details of each phase, and have some idea of how to construct your particular Web design process. This is a great first step, but it’s still only a first step! Don’t miss this next bit: knowing how a process can enhance your overall business and how to use it when approaching and interacting with clients.

Refining the Process
The process will be different for each designer, and for each project. Develop a process for yourself, and identify whatever is useful to you or your team. Only then will the process be truly useful. After all, freelancers can serve drastically different target markets.

Bulleted lists are well and good, but the process can be much more useful and elaborate than that. Many of the resources, tools and links posted on Web design blogs and Twitter feeds fit into different parts of the process. An incredibly useful way to refine the process is to add resource links to each phase, and to develop your own resources, such as branded document templates.



Some commonly used documents of freelancers:


Client questionnaire,
Invoice,
Project charter,
Documentation for hand-off to client,
User accounts,
Database table charts,
Site map.

Files and Archive
Documentation and storage are important to grasp. As mundane as these tasks can be, they certainly help when tax season rolls around or when a small freelance venture begins to expand. You can never be too disciplined when it comes to efficiency in work and time. You could establish a standard document format and folder structure for all of your clients, or maintain a list or archive of previous clients and project files. You could employ anything from simple lists to all-out small-business accounting practices.

A Process Puts the Client at Ease
Many clients view Web development as a black box, even after you’ve tried to educate them on its methods. To them, they provide their requirements, suggestions and content, and then some time later a website appears or begins to take shape. They’re often completely unaware of major aspects of the process, such as the separation of design and development. Having an organized and concise process on hand can help organize a client’s thoughts and put their mind at ease, not to mention help them understand where their money is going.

Outlining my basic process as a freelancer is by far the most common first step I take with potential or new clients. A quick, high-level “This is how it works” discussion provides a framework for the entire project. Once you have this discussion, the client will better understands what specifically is needed from them, what you will be delivering at certain points in the timeline and what type of work you’ll be engaging in as you go along. Most of all, the discussion can nip any miscommunication or confusion in the bud.

Designers are often too deep into Web design to realize that most people have no idea what they do or understand their terminology or know the steps involved in creating a finished product. Starting fresh with a understandably “clueless” client can be daunting.



It’s a Business
It’s a business, and the steps outlined here are basically the path to small-business management. As you grow in clients or staff or contractors, you’ll find yourself with an ever-growing to-do list and a headache from all of the things to keep track of. Give yourself a break, and invest some time in finding tools to help you get the job done efficiently. An expanded process document is a great first step on this path.

Tips

Ask a non-technical friend to review your process. If it makes sense to them, it will make sense to your client.
Use the processes of other designers as a starting point to build or refine your own. See the related resources links.
Build document templates and Web apps into your process. This will save time and make you more professional.

Risks
One process cannot be applied to every project. Although your process will be useful when you first engage a client in the planning discussion, be sure to review it before the discussion takes place to ensure it fits the project.

Further Resources
Here are some links to resources that showcase sample Web design processes, as well as tools and templates to build integrate in your own process.


6 Phases of the Website Design/Development Process
A great example of a Web design process broken into six steps.
Comparison of Web Design Workflow Processes
A detailed comparison of different types of processes.
Sample Web Design Process, With Advice
Step-by-step breakdown of a Web design process, with goals and best practices.
50 Essential Web Apps for Freelancers
A great collection of Web applications to build into your process.
3 Links to Websites Offering Free Document Templates
A great place to gather document templates for freelance business use.
Wiki of Web Design Resource Links and Code Snippets

Have further resources to share? Post them in the comments.

(al) (il)


© Luke Reimer for Smashing Magazine, 2011.

]]></description>
<dc:subject>Design Web_Design workflow</dc:subject>
<dc:identifier>https://pinboard.in/u:anu/b:ac85f9777458/</dc:identifier>
<taxo:topics><rdf:Bag>	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:Design"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:Web_Design"/>
	<rdf:li rdf:resource="https://pinboard.in/u:anu/t:workflow"/>
</rdf:Bag></taxo:topics>
</item>
</rdf:RDF>