Author Archive

  • The more you try and practice Agile the less agile you become. And vice versa

    This Agile has a capital A. It can also have a lower case a, in which case it is an adjective, to be lean/nimble but that’s not what I’m talking about. Agile with a capital A is a noun, a name used for the philosophy described in the the Manifesto for Agile Software Development and the suite of methodologies primarily used for software development such as SCRUM and Extreme Programming.

    Tim’s post on Agile as a ‘Cargo Cult’ highlights a problem in the adoption of Agile, not only for software development but for creative and business processes. Everyone is trying to adapt to a rapid and disruptive world screwing with business models in every category. Organisations are looking to close the gap with nimble digital start-ups who are out-innovating them at a fraction of the cost-base. Agile seems to offer a well-packaged magic ability to compete in a new way.

    Unfortunately, a lot of confusion happens between being Agile as an adjective and a noun. Without understanding both, without the philosophy of being nimble and the processes of an Agile methodology, failure is assured.

    At it’s best Agile is fluid and rigorous, it can be more controlled and structured than a waterfall project but open to adaption and change. There is a necessary tension between the rigour on one side and it’s resistance to codification on the other so the more you try and practice Agile the less agile you become.

    When it comes to adoption lots of people suffer from the McLuhanesque mistake of appropriating the shape of the previous medium as the content for the next (props to Scott McCloud). In this I mean that they try to fit some of the rhetoric of agile around their existing people, culture, process and tools. This normally happens in one of two ways:

    Read full post

  • Compass and Video on the IPhone opens up an Augmented Reality World

    Massive excitement at Made By Many as the resident Apple fan-boys stayed in the office to keep up with the WWDC keynote. We cursed our recent MacBook Pro purchases and waited for news of the new IPhone. Some great news there but let down by the news that getting the IPhone 3GS means buying out the existing contracts! (Bad news here, all employees have an business IPhone at Made By Many).

    In that exciting news, the new IPhone will have a video-enabled camera and a compass. This means just one thing, with a GPS-enabled device, internet device that can now tell where it is pointing we are going to get a flood of Augmented Reality applications/games showing meta-data, social data and content onto the phone video screen. Combined with things like Google Streetview and Latitude (soon to be released on the IPhone) people will be viewing their world through the IPhone, with reviews of restaurants/bars, transport services (and bus times) projected onto their iphone-world. This could lead to an explosion of social geo-tagging for the IPhone carrying-set.

    I for one welcome our new augmented overlords and will be producing a line of AR-symbol carrying baseball caps for instant identification of Twitterers on the streets.

    For now the Sekai Camera iPhone application gives an early vision of this world.

  • SXSW-Free Twitter with Pipes. But what we need is middleware..

    Right, that’s it. I’ve had enough of not being at SXSW and getting assailed with people going to cool lectures, eating Tex-Mex and drinking cocktails. I’ve decided to create myself a SXSW-free Twitter.

    Unfortunately I only have a half-way-house solution feeding the Twitter stream through Yahoo Pipes and hacking out all SXSW mentions.

    For those that don’t know Yahoo Pipes it is a way of producing mashups and filters using a graphical interface for connect up “pipes of data” and little processing units. What i’ve done is taken some inputs for your username and password, built up a URL string for your Twitter RSS and passed it through a filter to strip out those annoying SXSWer mentions…. The end result.. a clean RSS feed. (props to www.techlifeweb.com who did the original Twitter pipes setup)

    Pipes build

    picture-4

    Unfortunately it’s only a halfway house as I can’t hook TweetDeck up to it. What is why we need Twitter-MiddleWare to allow applications to be invented to clean, filter and process your stream but can seamlessly hook together with the same API to allow any end-client to connect. It would require some authentication standards and a way to scale but hey, not too difficult right.

    pipes result

    You can use the SXSW-Free Twitter Yahoo Pipe at http://pipes.yahoo.com/stueccles/sxswfreetwitter

    Anyway for totally SXSW free twitter experience follow me @stueccles

  • Why all newspapers need a printed permalink

    Have you ever been reading your daily morning commute newspaper and stumbled across a great article and thought “I must share that with my friend X”. After getting to work, after partaking in your morning coffee, you browse through that papers online edition as you know with today’s more-convergent news operations everything is re-published online. Then you can twitter, del.icio.us or email that link off. But it’s impossible to find and the newspaper’s online search can’t find it because lets face-it their search is terrible. You give in and return to Techcrunch.

    So all I want is something dead simple. Why don’t newspapers publish a small tinyurl permalink underneath every article title pointing to it’s location in that newspaper ’s online website. Then when I see something interesting I want to read in full later, bookmark for reference or crucially share with friends and colleagues, it’s immediately available to me. I could even Twitter it on the spot.

    In the future newspapers are going to need to continue the reading experience back and forth through online and offline media to help fight the rising tide coming their way.

    So Telegraph, Guardian and Times Online how about a little link-love in the paper?

  • Tutorial for restful_authentication on Rails with Facebook Connect in 15 minutes

    Back in June 2007 I wrote a popular tutorial on writing Facebook platform applications with Ruby On Rails. Time has moved on since and Facebook has launched Facebook Connect which allows you to integrate Facebook into your own sites allowing authentication, registration, friend connecting, and Facebook feed posting in the context of your application. Mashable has a great post on 10 great implementations of Facebook Connect including Joost, Vimeo and Disqus.

    At Made By Many we are fans of the possibilites of Facebook Connect for lowering barriers of registration, extracting social graph and injecting your social media functions into the daily online life of users. There is little point trying to create a “new” facebook on your site. Your unique social proposition lies elsewhere with your content, community and tools.

    People have found the integration of Facebook Connect tricky and while great libraries like facebooker handle the API part, actually getting the profile linking and integration flow is harder. So I’ve written this tutorial to integrate the most often starter plugin for authentication and registration in Ruby On Rails restful_authentication with Facebook Connect to allow your users to login and register through Connect.

    First of all lets state what this integration is going to achieve.

    • As a user I can register to the site through entering my details so I can access all that great functionality
    • As a user I can login to the site through my entered username and password
    • As a user I can register to the site through Facebook Connect so I don’t have to fill in that form
    • As a user I can login to the site through Facebook Connect so I don’t have to remember two passwords
    • As a user I can connect my existing site user with my Facebook Connect user so I can later login through Facebook Connect

    We also have some constraints we need to consider

    • As a user if I register a user through entering my details and later login through Facebook Connect I want to make sure I retain my old user account

    So read on and i’ll have you Connected in 15 minutes.

    Read full post

  • BBC IPlayer Desktop on AIR. It’s all a little bit tricky.

    It’s news we have expected for a while, and it’s here in big bold BETA. The BBC IPlayer Desktop is going to let you download IPlayer video to watch offline at a later date (well within 7 days as it’s using Flash Digital Rights Management Server to protect the catch-up window).

    But it was a little tricky and use to find to say the least, although they have updated the site with some docs during the day. Sign up to the IPlayer Labs. Then you can install the player from http://www.bbc.co.uk/iplayer/install/bbc_iplayer_desktop. Or find some content to download (it’s not all of the content mind you) and look for the download button at the bottom and right after the video.

    After that it works nicely. Well as long as you remember to change the Settings in the application to give it more than 0 GB Hard disk space to use. So kind-of nicely, it certainly doesn’t feel intuitive.

    But it’s just a download manager, that’s all, there is no navigation experience like in Adobe Media Player. It’s just a respository to play your Iplayer from. A bit of a disappointment but if it means getting it this year rather than next, i’m for it.

  • Tutorial: Easy Rails recommendations with acts_as_recommendable

    Following up on Alex MacCaw’s post on collaborative filtering. The plugin we recently released acts_as_recommendable allows Rails developers to quickly add some user-driven recommendations of items to their latest great millionaire-making startup. At Made By Many we’ve been developing some great niche social-media Ruby On Rails sites recently with New Bamboo and Headshift. The new edge of social media is in the maths, commenting and rating is so old-school, it’s what you do with that data that counts.

    This is going to be a tutorial for simple integration of acts_as_recommendable to recommend your users some books.

    Read full post

  • Why we’re working with Rails

    A few weeks ago I was quoted in a New Media Age article about Ruby On Rails and the London agency market (available online for subscribers) and it’s worth following up a few things, especially on Made By Many’s involvement with Rails.

    At Made By Many we like to remain technology agnostic, which is why we don’t have a large team of developers. We feel this benefits us and our clients more by not overly invested in one thing that limits our creative output and may not be the best solution for our clients. This enables us to consult on the whole range of technology strategies and lets us play with best technologies around.

    That doesn’t mean we don’t have some favorites, and those are delivering massive benefits for our clients and fit with the creative work and processes we adopt. Is this regard Ruby On Rails has been a fantastic choice for some of the projects we have been working on, and it’s for the same reasons that Alex MacCaw and I have been so involved with it for the past few years.

    The creative solutions we architect and design are geared towards delivering bespoke functionality, exciter/delighter features and unique social propositions. This, combined with a strategy to release early and iterate, means we need development speed and a flexible framework. Working with Rails has given that and we have used it ourselves on a number of smaller projects as well as working with partners on three big new social media sites.

    This doesn’t mean it’s easy but we have been working with some real experts in New Bamboo and combining agile design and agile development approaches. The on-going issue with Rails is around effective and scalable deployment, Ruby itself it not as fast as other languages and Rails has seen some bloat slowing it down. This means you do need some expertise in creating some scalable applications, but with some prudent caching strategies and the beauty of memcached it’s more than possible. In the medium term these problems will disappear with Ruby 1.9, Enterprise Ruby and Rubinius making Ruby faster and continual Rails optimisations.

    I still believe that to get the best of Rails you need some experts, otherwise you’ll never see the flexibility and speed of the technology applied. We are seeing more and more calls for Rails developers and with firms such as the BBC, Endemol, Channel 4 and EMI already on Rails there is going to be a greater need. Hopefully we can continue to get great development expertise in London rather than see RoR degenerate to the state of PHP hacking (not that there aren’t some top-natch PHP outfits out-there).

    I think we’ll be working with Rails for a while but we are still working with PHP, Flex, AIR and lots of JQuery as well, but in the future we’ll be looking to work with the best technology around for our clients and our own projects.

  • Using Capistrano with PHP, specifically Wordpress

    Here at Made By Many we are technology agnostic. Primarily because we believe a client should use the best technology solutions to fit them and fit the problem we are trying to solve. We work with lots of in-house technology teams and out-sourced partners for clients, offering technology consultancy wrapped into a holistic offering on next-generation website problems.

    That’s not to say we don’t have technology preferences. With all things being equal for greenfield deployments we can work with the best technology to do the job. That’s why we have delivered several solutions using Ruby On Rails and use Wordpress for delivering blog solutions, such as this one.

    I’ve spent some time making Wordpress deployments as easy as Ruby On Rails using the excellent Capistrano, this also lets me control environments which are hosting both Wordpress and Ruby On Rails in the same way.

    Capistrano 2, while built for Ruby On Rails, can be used as a generic deployment tool with a little work. It adds capabilities to open-source infrastructures which were previously only available to things like high-end J2EE application servers. Here are some of the things to make Wordpress deployments with Capistrano.

    Some dependencies

    You are going to need rubygems and capistrano installed on your machine and apache on your server.

    Directory structure

    I use a directory server for my PHP applications which has parallels with a Rails directory, but because it’s PHP all of the code lives in the public directory. You are going to need this structure to separate out the PHP from the Capistrano files.

       wpproject        |______config   (this is for storing the capistrano deploy.rb file)        |______log      (for server logs)        |______private        |______public   (the webserver vhost root with all the PHP files)
      mkdir -p wpproject/config  mkdir -p wpproject/log  mkdir -p wpproject/private

    Capistranoing Wordpress

    Now we install the latest version of Wordpress.

      cd wpproject  svn export http://svn.automattic.com/wordpress/trunk/ public

    Great, now lets capistrano it, its a simple capify command away.

      capify .

    Now we have to make some recipes for capistrano. These will be our series of commands to make the deployments.

    Creating a Wordpress Deploy Setup Recipe

    I created an extensive Capistrano recipe for configuring a new instance of Wordpress, of which we’ll talk about the most basic setup.

    Open up wp/project/config/deploy.rb in your favourite editor.

    You need to add some setup tasks

    set :app_symlinks, ["wp-content/avatars","wp-content/uploads","wp-content/cache"]
    
    namespace :wordpress donamespace :symlinks do
    
    desc "Setup application symlinks in the public"task :setup, :roles => [:web] doif app_symlinksapp_symlinks.each { |link| run "mkdir -p #{shared_path}/public/#{link}" }endend
    
    desc "Link public directories to shared location."task :update, :roles => [:web] doif app_symlinksapp_symlinks.each { |link| run "ln -nfs #{shared_path}/public/#{link} #{current_path}/public/#{link}" }endsend(run_method, "rm -f #{current_path}/public/wp-config.php")send(run_method, "ln -nfs #{shared_path}/public/wp-config.php #{current_path}/public/wp-config.php")endendend

    This sets symlinks from the release directory under the current link to directories in shared. This is so that information such as avatars, uploads and cache are maintained between releases. This also deletes any development wp-config you may have deployed and link to the server one stored in the shared directory.

    This deployment scenario is also going to get Capistrano to create this wp-config for us.

    Adding the follow tasks to deploy.rb in the wordpress namespace

    set :wp_config_template, "wp-config.php.erb"
    
    task :wp_config_php, :roles => [:web] dofile = File.join(File.dirname(__FILE__), "templates", wp_config_template)template = File.read(file)buffer = ERB.new(template).result(binding)put buffer, "#{shared_path}/public/wp-config.php", :mode => 0444end

    And create the following file in a wpproject/config/templates directory

    wp-config.php.erb

    // ** MySQL settings ** //define('WP_CACHE', false); //Added by WP-Cache Managerdefine('DB_NAME', '<%=wp_db_name%>');    // The name of the databasedefine('DB_USER', '<%=wp_db_user%>');     // Your MySQL usernamedefine('DB_PASSWORD', '<%=wp_db_password%>'); // ...and passworddefine('DB_HOST', '<%=wp_db_host%>');    // 99% chance you won't need to change this valuedefine('DB_CHARSET', '<%=wp_db_charset%>');define('DB_COLLATE', '');
    
    // You can have multiple installations in one database if you give each a unique prefix$table_prefix  = 'wp_';   // Only numbers, letters, and underscores please!
    
    // Change this to localize WordPress.  A corresponding MO file for the// chosen language must be installed to wp-content/languages.// For example, install de.mo to wp-content/languages and set WPLANG to 'de'// to enable German language support.define ('WPLANG', '');
    
    /* That's all, stop editing! Happy blogging. */
    
    define('ABSPATH', '<%="#{current_path}/public/"%>');require_once(ABSPATH.'wp-settings.php');?>

    This is going to create our server wp-config file for us but you’ll need to set the variables in the deploy.rb file

    set :wp_db_name, "ourblog_wp"set :wp_db_user, "ourblog"set :wp_db_password, "pa55w0rd"set :wp_db_host, "localhost"set :wp_db_charset, "utf8"

    But wait there is more!! We can also create our apache vhost using the same method

    set :apache_server_name, "madebymany.co.uk"set :application, "ourblog"set :domain, "madebymany.co.uk"set :apache_server_aliases, []set :apache_ctl, "/etc/init.d/apache2"set :vhost_template, "wp_apache_vhost.erb"
    
    namespace :apache do
    
    task :vhost, :roles => [:web] doset :apache_vhost_aconf, "/etc/apache2/sites-available/#{application}"set :apache_vhost_econf, "/etc/apache2/sites-enabled/#{application}"
    
    server_aliases = []server_aliases << "www.#{apache_server_name}"server_aliases.concat apache_server_aliasesset :apache_server_aliases_array, server_aliases
    
    file = File.join(File.dirname(__FILE__), "templates", vhost_template)template = File.read(file)buffer = ERB.new(template).result(binding)put buffer, "#{shared_path}/httpd.conf", :mode => 0444send(run_method, "cp #{shared_path}/httpd.conf #{apache_vhost_aconf}")send(run_method, "rm -f #{shared_path}/httpd.conf")send(run_method, "ln -nfs #{apache_vhost_aconf} #{apache_vhost_econf}")end
    
    desc "Start Apache "task :start, :roles => :web dosudo "#{apache_ctl} start"end
    
    desc "Restart Apache "task :restart, :roles => :web dosudo "#{apache_ctl} restart"end
    
    desc "Stop Apache "task :stop, :roles => :web dosudo "#{apache_ctl} stop"endend

    This works with another Ruby builder (ERB) template file under wpproject/config/templates. In this example I’m using an Ubuntu Linux server with apache configuration installed under /etc/apache2 and a standard Debian setup using files under /etc/apache2/sites-available with a symlink from /etc/apache2/sites-enabled.

    #vhost for <%=apache_server_name%>    ServerName  <%=apache_server_name%>    <% apache_server_aliases_array.each do |a| %>      ServerAlias <%= "#{a}" %>    <% end %>    DocumentRoot <%= "#{current_path}/public" %>    <%= "#{current_path}/public" %>>      Options FollowSymLinks      AllowOverride All      Order allow,deny      Allow from all    
    
        RewriteEngine on
    
        # Prevent access to .svn directories    RewriteRule ^(.*/)?\.svn/ - [F,L]    ErrorDocument 403 "Access Forbidden"
    
        # Check for maintenance file and redirect all requests    RewriteCond %{DOCUMENT_ROOT}/system/maintenance.html -f    RewriteCond %{SCRIPT_FILENAME} !maintenance.html    RewriteRule ^.*$ /system/maintenance.html [L]
    
        # Deflate    AddOutputFilterByType DEFLATE text/html text/plain text/xml    BrowserMatch ^Mozilla/4 gzip-only-text/html    BrowserMatch ^Mozilla/4\.0[678] no-gzip    BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
    
        ErrorLog <%= "#{current_path}/log/apache_error.log" %>    CustomLog <%= "#{current_path}/log/apache_access.log common" %>
    
    

    Almost done with configuration but it needs to be tied into the deploy:setup task.

    namespace :config do
    
    desc "Configure new wordpress install"task :default, :roles => [:web] dowordpress.wp_config_phpapache.vhostendend
    
    after   'deploy:setup', 'wordpress:config'before  'deploy:update_code', 'wordpress:symlinks:setup'after   'deploy:symlink', 'wordpress:symlinks:update'

    My deployment setup recipes are a bit more complex, creating the database, running the wordpress install scripts and bootstrapping with some users, but this should be enough to get you going for Wordpress or any other PHP CMS setups.

    We now need to make sure the deployment of releases works.

    Creating a Wordpress Release Recipe

    There are two basic options here. Capistrano allows you to release from your source control system such as SVN or Git, or alternatively you can do a copy from your local filesystem. Obviously if you are working in a team greater than one, I kinda hope you have source control.

    Assuming you have checked the entire wpproject into your SVN server. You need the following in your deploy.rb file.

    default_run_options[:pty] = trueset :keep_releases, 3set :use_sudo, trueset :user, "deploy"set :repository,  "svn+ssh://#{user}@madebymany.co.uk/var/svn/wpprojects/ourblog/trunk"set :deploy_to, "/var/www/apps/#{application}"set :deploy_via, :export
    
    role :app, "madebymany.co.uk"role :web, "madebymany.co.uk"role :db,  "madebymany.co.uk", :primary => true
    
    namespace :deploy dotask :restart, :roles => :app do# Do nothing or restart apache# apache.restartendend
    
    after   :deploy,'deploy:cleanup'

    And that’s it. The after hooks that modify the symlinks are handling the other areas of the deployment, so all we need to do is override the restart. You can get away with not restarting apache for sure but sometimes you can have APC cache issues.

    To deploy your Wordpress, create a database then:

      cap deploy:setup  cap deploy

    And you are ready to blog, when you need to make a release just cap deploy. Hopefully this is a good intro because you can use Capistrano with lots of PHP CMS’s using a similar setup.

  • Taken with Toonlet

    I love online cartoons. I’ve always been a fan of penny-arcade, pvponline and userfriendly. Since offline media began, monks have been scribing illustrations in margins and the newspaper cartoonist has been an institution in expressing the zeitgeist. Now several web2.0 startups like such as Toondo and Pixton let you create your own.

    I like Toonlet which is so straightforward but allows for some cool looking comics. Here’s one I created earlier:

    Read full post

Our latest tweets

Categories

Archives

Find us on the web