Uncategorized


21
Jun 11

Posting to linkedin from php and codeigniter

I recently got tasked with posting offline messages to twitter, i.e when a user completes an action on my application, there would be a message posted to linkedin.

I looked at the many oauth libraries about on the web for php and codeigniter and couldn’t find one that worked perfectly for my situation so i mashed a few together and ended up with this- and i learnt a few lessons on the way.

Where I got the php libraries that where built around the linkedin api, nothing was clean and coherent.. and simple so I found a twitter library and modified it to my needs- both linkedin and twitter are built around OAUTH (so is facebook) and this made it super easy to change a few urls and directories and have a working library.

The source for my derived work came from this library listed here - https://www.packtpub.com/article/user-authentication-with-codeigniter-1.7-using-twitter-oauth if you check my code you will see i edited slightly to change it for use with linkedin. If your using this library you will also need the PHP oauth Library which is listed here- http://oauth.googlecode.com/svn/code/php/

The library- save this as linked.php in your application/libraries folder- also save your “OAuth.php” in there as well

The llibrary

 
<?php
 
require_once("OAuth.php");
 
class linkedin
{
 var $consumer;
 var $token;
 var $method;
 var $http_status;
 var $last_api_call;
 var $callback;
 
	function linkedin($data)
	{
		$this->method = new OAuthSignatureMethod_HMAC_SHA1();
		$this->consumer = new OAuthConsumer($data['consumer_key'], $data['consumer_secret']);
		$this->callback = $data['callback_url'];
 
		//print_r($data);
 
 
		if(!empty($data['oauth_token']) && !empty($data['oauth_token_secret']) && !empty($data['callback_url']))
		{
			$this->token = new OAuthConsumer($data['oauth_token'],$data['oauth_token_secret']);
 
 
		}
		else
		{
			$this->token = NULL;
		}
 }
 
 function debug_info()
{
 echo("Last API Call: ".$this->last_api_call."<br />\n");
 echo("Response Code: ".$this->http_status."<br />\n");
 }
 
 function get_request_token()
{
	 $args = array();
 
	 $request = OAuthRequest::from_consumer_and_token($this->consumer,
		 $this->token, 'GET',
		  "https://api.linkedin.com/uas/oauth/requestToken", $args);
 
	$request->set_parameter("oauth_callback", $this->callback);
	$request->sign_request($this->method, $this->consumer,$this->token);
	$request = $this->http($request->to_url());
 
	 parse_str($request,$token);
 
	 $this->token = new OAuthConsumer($token['oauth_token'],$token['oauth_token_secret'],$this->callback);
 
	 return $token;
 }
 
	function get_access_token($oauth_verifier)
	{
		$args = array();
 
		$request = OAuthRequest::from_consumer_and_token($this->consumer, $this->token, 'GET', "https://api.linkedin.com/uas/oauth/accessToken",$args);
		$request->set_parameter("oauth_verifier", $oauth_verifier);
		$request->sign_request($this->method, $this->consumer,$this->token);
		$request = $this->http($request->to_url());
 
		echo $request ;
 
		parse_str($request,$token);
		//echo $oauth_verifier;
 
		$this->token = new OAuthConsumer($token['oauth_token'],
		$token['oauth_token_secret'],1);
 
		return $token;
	}
 
	 function parse_request($string)
	 {
		 $args = explode("&", $string);
		 $args[] = explode("=", $args['0']);
		 $args[] = explode("=", $args['1']);
 
		 $token[$args['2']['0']] = $args['2']['1'];
		 $token[$args['3']['0']] = $args['3']['1'];
 
		 return $token;
	 }
 
	function parse_access($string)
	{
		$r = array();
 
		foreach(explode('&', $string) as $param)
		{
			$pair = explode('=', $param, 2);
			if(count($pair) != 2) continue;
			$r[urldecode($pair[0])] = urldecode($pair[1]);
		}
		return $r;
	}
 
	function get_authorize_URL($token)
	{
		if(is_array($token)) $token = $token['oauth_token'];
		return "https://api.linkedin.com/uas/oauth/authorize?oauth_token=" .
		  $token;
	}
 
	function http($url, $post_data = null)
	{
		$ch = curl_init();
 
		if(defined("CURL_CA_BUNDLE_PATH"))
		curl_setopt($ch, CURLOPT_CAINFO, CURL_CA_BUNDLE_PATH);
 
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
		curl_setopt($ch, CURLOPT_TIMEOUT, 30);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
 
		if(isset($post_data))
		{
			curl_setopt($ch, CURLOPT_POST, 1);
			curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
		}
 
		$response = curl_exec($ch);
		$this->http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
		$this->last_api_call = $url;
		curl_close($ch);
 
		return $response;
	}
 
  function share($comment, $title, $url, $imageUrl,$access_token) {
      $shareUrl = "http://api.linkedin.com/v1/people/~/shares";
 
      $xml = "<share>
              <comment>$comment</comment>
              <content>
                 <title>$title</title>
                 <submitted-url>$url</submitted-url>
                 <submitted-image-url>$imageUrl</submitted-image-url>
              </content>
              <visibility>
                 anyone
              </visibility>
            </share>";
		//echo $this->consumer;
		//echo "<br>at : ".$this->access_token."<br>";
 
 
	//echo "<b>".$access_token."</b>";
      $request = OAuthRequest::from_consumer_and_token($this->consumer, $access_token, "POST", $shareUrl);
      $request->sign_request($this->method, $this->consumer, $access_token);
      $auth_header = $request->to_header("https://api.linkedin.com");
 
	  /*
		echo $xml . "\n";
		echo $auth_header . "\n";
	*/
		//$auth_header = preg_replace("/Authorization\: OAuth\,/", "Authorization: OAuth ", $auth_header);
		//$auth_header = preg_replace('/\"\,/', '", ', $auth_header);
 
 
      $response = $this->httpRequest($shareUrl, $auth_header, "POST", $xml);
	  echo $response;
      return $response;
  }
 
 
	function httpRequest($url, $auth_header, $method, $body = NULL) {
 
		if (!$method) {
			$method = "GET";
		};
 
		//echo $url. " " .$method. " " .$body;
 
		//echo $auth_header;
 
		$curl = curl_init();
		curl_setopt($curl, CURLOPT_URL, $url);
		curl_setopt($curl, CURLOPT_HEADER, 0);
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($curl, CURLOPT_HTTPHEADER, array($auth_header)); // Set the headers.
 
		//echo $auth_header;
 
		if ($body) {
			curl_setopt($curl, CURLOPT_POST, 1);
			curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
			curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
			curl_setopt($curl, CURLOPT_HTTPHEADER, array($auth_header, "Content-Type: text/xml;charset=utf-8"));  
 
 
		}
 
		$data = curl_exec($curl);
		echo curl_getinfo($curl, CURLINFO_HTTP_CODE);
		//if ($this->debug) {
			//echo "bla";
			echo $data . "\n";
		//}
 
		curl_close($curl);
 
		return $data; 
	}
}
?>

I have commented the code more so than giving a run through of how it works.

The codeigniter stuff :)

<?php
session_start();
 
class User extends controller {
 
 
	var $data;
 
	function user(){
 
		parent::Controller();
 
		parse_str(substr(strrchr($_SERVER['REQUEST_URI'], "?"), 1), $_GET);
		$this->load->helper('url');
		$this->load->library('session');
 
		$this->data['consumer_key'] = "";
		$this->data['consumer_secret'] = "";
		$this->data['callback_url'] = "yourcallback";
 
	}
 
	function index(){
 
 
 
 
	}
 
 
	function linkedin(){
 
 
		$this->load->library('linkedin', $this->data);
		$token = $this->linkedin->get_request_token();
 
		$_SESSION['oauth_request_token'] = $token['oauth_token'];
		$_SESSION['oauth_request_token_secret'] =   $token['oauth_token_secret'];
 
		$request_link = $this->linkedin->get_authorize_URL($token);
 
		$data['link'] = $request_link;
 
 
		header("Location: " . $request_link);
	}
 
 
	function linkedin_submit(){
 
 
 
		$this->data['oauth_token'] = $_SESSION['oauth_request_token'];
		$this->data['oauth_token_secret'] = $_SESSION['oauth_request_token_secret'];
 
		//
		//laod the library with the variables defined in the constructor
		//
		$this->load->library('linkedin', $this->data);
		//echo $_REQUEST['oauth_verifier'];
 
		$_SESSION['oauth_verifier']     =  $_REQUEST['oauth_verifier'];
 
		/* Request access tokens from linkedin */
		$tokens = $this->linkedin->get_access_token($_SESSION['oauth_verifier']);
		/*Save the access tokens.*/
		/*Normally these would be saved in a database for future use. */
		$_SESSION['oauth_access_token'] = $tokens['oauth_token'];
 
		$_SESSION['oauth_access_token_secret'] = $tokens['oauth_token_secret'];
 
 
 
		//store your user info
		//if your going to store the tokens you will need to serialise in and out of the db
		//
		// you will need to write your own models- simple storage- serialization done here in the controller
 
		$this->load->model('muser');
		$data_id = array('linked_in' => serialize($this->linkedin->token),'id' => $user_id,'oauth_secret' => $_REQUEST['oauth_verifier']);
 
		//i used this to store the link_in tokens in the db
 
		if(!$this->muser->store_id($data_id)){
 
			//error
 
		}
 
 
	}
 
	function linkedin_post(){
 
		$id = $this->input->get('id');	
 
		//
		//this is the get from db
		//
		//you will have to make your own models
		//
 
 
		$row = $this->muser->get_by_id($id);
 
		$linked_in = $row['linked_in'];
 
 
		//
		//setup the post info
		//
 
		$comment = "message";
		$title = "story title";
		$targetUrl = "http://link";
		$imgUrl = "image title";
 
		//
		//
		//load the library for linkedin with the variables defined in the constructor 
		//
 
		$this->load->library('linkedin', $this->data);
 
 
		$apiCallStatus    =   $this->linkedin->share($comment, $title, $targetUrl, $imgUrl,unserialize($linked_in));
 
	}
 
?>

16
May 11

facebook marketing strategy to increase business page fans/likes

Introduction- this is for both consumer and business brands/pages

I was recently requested to quote for a project for a potential client who had a major brand on their books and they wanted a flash game developed in a very short time. Not only did they have an unrealistic time frame to have the game developed (a week) but they had no experience with facebook games and to top it of they didn’t even have an idea of what game they wanted.
I suggested a cheaper solution (which I am going to detail below) that developing a game but they didn’t want to listen, therefore I quote an expensive price, if they wanted me to develop anything for them, they were going to have to pay for the headaches as well as my time..

What did I suggest ? -> “The gated competition”

The gated competition, bends facebook’s terms of service but is very much a common practice now on facebook.

The gated competition is where a user has to “like” (pass through the gate) in order to take part in a competition. Once the user has liked the page, they are then presented the next stage, which is usually to enter their details to be entered into a draw or presented with a download link to download the “prize”. You can see a page I made for a client-

So how do I win friends and influence people.. via facebook for my page

Firstly- this isn’t a “free” solution- you need to spend time/money advertising your page to seed the campaign. The value in this strategy is- that I can not find any strategy which returns the most return on investment which can scale in terms of developping new likes/leads on facebook

There are three elements that make up this process-

  1. The page
  2. The prize
  3. The advertising

Without all three of these elements your campaign will not work fully

The page-

  • The tab must be set as your default landing tab when someone visits your facebook page
  • The tab must be gated- the user can only interact with the tab if they have “liked” the page
  • The unlike tab must inform the user why they should like the page- your sales text
  • The tab must perform relevant task- allow data collection or generate download link
  • Once user has completed the task of the tab, they a presented to post to their wall that they have participated.
  • A privacy policy should be used to tell users why your collecting their data.

The prize

  • Give to receive. The prize is the incentive of why someone should come and like your page and enter for a chance to win the item.
  • Pick a prize that matches what the target demographic of your product or service that your potential customer. would be interested in. The person who contacted me to in enquire about developing game had very specific demographic information- 18-24 years old and mainly male, I suggested a gaming console with the latest guitar hero, plus a hamper of the product they where advertising.
  • If your a business to business page- give away a service or a product that matches what your business offers-

The advertising

Without advertising the strategy doesn’t work to its full potential- if you have a few thousand likes already it may increase your likes by 0%-10%-20% over a monthly time frame but with advertising it can see even greater returns. Advertise the competition and the prize!

Where to advertise

  • Facebook adverts allow you to advertise by demographic information and interests- this can be more advantageous when advertising consumer products
  • Google adwords can be used t target users with very specific key terms which can be more advantageous for companies advertising business to business products/services
  • Offline- if your business has premises- having the facebook icon dotted about the place with the URL can help- include your facebook URL in all print – on the back of business cards right through to product packaging.

The why

  • You can collect email addresses- you may not be able to get users to buy on facebook but people still buy from upselling in emails- groupon has seen their business explode with daily emails
  • You can collect likes within a targeted demographic/interest
  • You get most return on your investment. Instead of just advertising a facebook page- you can now collect email addresses and also encourage users to share content to their wall by making it the “next step” in the competition process
  • Once you have people like your page, you can create shareable branded content

The formula

If you are not receiving enough likes from this strategy here are two points to consider
Your advertising spend is not high enough, increase your advertising spend and you will see increased date collected
If this didn’t work, maybe the prize was not a big enough fruit. Try the competition again with a larger prize.

The trial-

If you want to see how It looks- check out http://www.facebook.com/newyorkcolor which now use the competition software

The software

If you fancy using this strategy that has seen great returns – here’s what the software does

  • Checks if the user has liked the page or not
  • Validates and collects the data from the facebook tabs
  • Has a separate admin to view the collected data.
  • Separate Admin allows the export as csv to export data to an email marketing solution

5
Apr 11

Checking in to facebook using the graph api and php

When a client contacted me last week to implement facebook checkins into an existing application i had to go searching for information. The only information i could get was from the API, there was no real tutorial out there explaining each step of the process- hopefully I address this issue.

firstly we need the user to accept the application- we do this by bouncing them off to facebook – you need to include the facebook php library – you can find it here

 
<?php $facebook = new Facebook(array( 'appId' =>"YOURAPPID",
	  'secret' => "APPSECRET",
	  'cookie' => false
	));
 
 
if ($me) {
	$logoutUrl =   $facebook->getLogoutUrl();
} else {
	$loginUrl   =   $facebook->getLoginUrl(array(
		   'canvas'    => 0,
		   'fbconnect' => 1,
		   'req_perms' => 'publish_stream,status_update,offline_access,publish_checkins'
		   ));
}
?>
<? if ($me){?>
	Thanks- application has been accepted
<? }else{ ?>
 
	<a href="<?= $loginUrl; ?>">
	Login into Facebook to accept applicatioon
	 </a>
 
<?}?>
 
 
<?   $url = "https://graph.facebook.com/oauth/access_token"; 		 
	 $client_id = "client_id"; 		  
	 $client_secret = "app_id"; 		  
	 $postString = "client_id=$client_id&client_secret=$client_secret&type=client_cred&scope=email,publish_stream,offline_access,publish_checkins"; 		 
//This first bit of code is to get the application a access token.
$curl = curl_init(); 		  curl_setopt($curl, CURLOPT_URL, $url); 		  curl_setopt($curl, CURLOPT_FAILONERROR, 1); 		  curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 		  //curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); 		  curl_setopt($curl, CURLOPT_POST, 1); 		  curl_setopt($curl, CURLOPT_POSTFIELDS, $postString); 		  $response = curl_exec($curl); 	 		 		 $url = "https://graph.facebook.com/".$FBID."/checkins"; 		 $token = substr($response,13); 		   		  $attachment = array( 		   'access_token' =-->  $token,
		   'place' => 'place_ID',
		   'message' =>'I went to placename today',
 
		   'picture' => 'http://logo for post/',
		   'coordinates' => json_encode(array(
			'latitude'  => 'lat',
			'longitude' => 'long',
			'tags' => "")));//tag a user to be tagged in as well
 
		$attachment =	$attachment;
		  print_r($attachment);
 
		  $ch = curl_init();
		  curl_setopt($ch, CURLOPT_URL,$url);
		  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // This i added as the URL is https
		  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);      // This i added as the URL is https
		  curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
		  curl_setopt($ch, CURLOPT_POST, true); // Do I need this ?
		  curl_setopt($ch, CURLOPT_POSTFIELDS, $attachment);
		  $result= curl_exec($ch);
		  curl_close ($ch);
		  print_r($result);// some debug info
 
?>

The main problem i had with the code was to get the location details- the longitude and latitude had to be encoded as json- luckily php has a handy little tag for this which can turn a php array into json- you do not need to encode the whole attachment just the location details.

You can see with the post below- its a pretty normal post but it has tagged on the back of a map of the location. you can check out the docs here for adding more info to the post- Facebook checkin API DOC


29
Mar 11

How to target potential clients using seo

The idea for this blog post came from me looking through the search terms that my website was receiving traffic from and i thought I would create an article to match the term- seems with a bit of research there is an poorly written article already out there, this post is going to share my knowledge and how I have gone about trying to get clients using SEO.

I am not going to give you basic SEO information like keyword research or where to put keywords, this post is more a strategy in how to target specific customers.

Step one- Identify what you offer and what services your looking clients for

What works best in SEO is highly targeted key term selection- if you are an accountant looking new clients- “accountant” would be a very competitive term rather than a specific service “Sole Trader Income Tax Preparation” which is a specific term and would be less competitive.

When you know specifically what services you offer the next step is to research which key terms to target. You can type the services you offer into somewhere like Google Keyword Tool which will give you an idea of what people are searching for and give you some idea of terms you should be targeting. Every key term should then be put into a google search to identify how competitive the term is

Step two- Build Pages

The next step in the process is to take your key services key term and build pages explaining the service you offer and why a potential client should use your organisation.

I did this with justni.com and specifically a page like facebook apps developer which targets the service I offer. My Ideal client for this is a design agency who may not have the technical skills that facebook apps require but have a client interested in developing an app.

Step Three – Setup a blog and write about your sector/area

As you can see, I have setup this blog on the sub domain of this website, but every post and page still links back to my main site, therefore any Google juice or burst in traffic I get to the blog is fed on to the main website. You do not have to write about your sector- you can post videos or pictures- an excellent example of a success story of this is wine library tv where @garyvee made 1000 videos about wine and became  an internet celebrity (having almost 900k followers on twitter) while starting out with a camera and nothing else.

Step four- Include a call to action

When a user is browsing your page they should see something to click on where they can either contact you or find your contact details. I created a bold black button for this website on the right hand side which directs people to my contact page.

Do not leave it up to the user to find your contact details, make it bold, make it call out at the user- this will increase your conversion rate and in turn increase your leads generated.

Step five- KILLER no1 TIP for SEO-

Create great content! that’s it… if you can create great content that people want to share, thats 90% of the battle- if your rinsing other peoples content and trying to take the copy and paste approach- it will not work. Users/consumers like new, fresh and innovative ideas, that’s why the godfather isn’t stuck at Amazon’s no.1 spot all the time- people like new things! Gary Vaynerchuck won because he created fun and innovative content around wine which people perceive as a stuck up sector. My favourite episode was where Gary compared what wine went with breakfast cereal- see it here- There ya go.. a point just proved.

Step six – Persist and Persevere

SEO is a slow process- like life, the older the person the wiser the person is (meant to be). Google ranks content using this same principle, as your domain/content ages it will rank higher than new or fresh content. Unless your domain carries a lot of authority, new content will take a while to rank.

If you add one post a week for a year, you will have 52 posts by a year end- if each posts receives 4 hits a week = that’s 208 a week! For my business, one enquiry a week would keep my business going, usually much less than this. For any small business 1000/hits per month to their Blog is an ample amount of traffic to keep them going

Fine me on twitter at @yrecruit_chris


14
Mar 11

Making your Facebook shares better/prettier

If your running a website and actively encourage users to share ccntent across facebook, it may be a good idea to control what way its being shared. Facebook includes graph meta tags which allow you to default to a certain image for the post on facebook and what title.

Add these tags between the <head> tags on your page

1
2
3
4
<meta property="og:type" content="blog" />
<meta property="og:url" content="http://blog.yrecruit.com/2011/03/the-state-of-online-recruitment-websites-in-ireland/" />
<meta property="og:site_name" content="Yrecruit Blog" />
<meta property="og:image" content="http://yrecruit.com/imgs/yrecruit_share.png"/>

This is the content for the tags on one of my new sites which enables a logo to be displayed along with the title, if i didnt have that tag included, the logo would not be displayed at all.

Now my post looks like this without the logo

Having added in the tags now i get a pretty branded logo included with my blog post

Plugins for wordpress

Manually putting this on every page would be tedious and time consuming, luckily i use wordpress to power my blogs and it comes with a handy tool to include the tags.

The plugin i use is listed below-
Open Graph
Add Open Graph metadata to your pages.

I added in my own image tag to the header file of my theme and made sure the image worked with the posts

For more info

Check out the page on facebook.com about sharing content


14
Feb 11

Web Application Development for Ferrari

I recently completed an web application for Ferrari in conjunction with Jason Dean at TheMews.tv for his client Pierce SmartFusion NewYork. This was a demanding app due to the quick turnaround time required and feature specification changes but its great to work on something that was so intricate and mission critical (a lot of people will be using the application)

What it was for

The main core of the application was to allow potential Ferrari customers to book a test drive and experience a new car that Ferrari was launching. A mailing list was already build that had the web address of the application where a user could import the code that they where suplied with and booking a time slot that they where free on a specific date to test drive the car.

The main features of the application

  • Allow people who were identified to book a car at a specific time and venue.
  • Allow Ferrari to track who made bookings and where
  • Allow Ferrari to rate the customers on the likelihood of the participant in making a purchase.
  • Allow participants to register when they arrived using an ipad version of the website

This doesn’t sound complicated at all but with only 4 cars available, at certain dates, multiple venues and thousands of potential users the system cant get very complicated very quickly.

Build process

The normal build process that most applications whether it be for web, mobile or even facebook is that I am supplied with images of the layout and specification document then it is up to me to turn these two pieces in to a work application.

With the client on Skype liaising with myself and the Ferrari guys, we were able to test the application thoroughly and make the feature requests and changes the same day.

Tools and technology used

To complete this project the basic stack that was used for the web application was-

  • php/mysql combo
  • codeigniter 1.7
  • Blueprint (css for the admin)
  • I also used simplesecurelogin for user login management with CI

As always my development environment is -

  • 2 machines, one running windows 7 and one running windows xp
  • Notepad++
  • Xampp
  • photoshop /filezilla

Other tools include Gmail and skype for communications and to do lists. I also use synergy across my two machines, it allows me to run a 3 monitor setup using the same keyboard and mouse for all three, freeing up desk space

Obstacles Overcome

There was quite a few obstacles to overcome in this project and i have listed them below and how the project was successfully delivered.

  • User experience- a lot of the time, no one plans what an admin section is to have, there is a lot of data in this system and a lot to be viewed. The original designs worked well but limited the user experience, I suggested a few tweaks and the user experience for the user was improved
  • Multiple sources of data, The importation of the customer lists came from multiple different sources with varying formatting. Using php’s inbuilt functions, code could be written quickly to overcome this obstacle.
  • Dates, times and cars. This was a major problem, it was a mission critical kind of problem where you couldn’t have multiple bookings more than 4 as there was only 4 cars available. With multiple cars available at multiple times on multiple dates at multiple venues the system could have easily got out of hand but with continual testing something similar to TDD, iterations were made quickly to build a scalable application
  • iPad view. I do not own many apple products and I certainly do not use an ipad, but one of the requirements was to allow users to register when they arrive at their specified time slot. I had never done an IPad application but I took the original design and scaled it to match the screen resolution provided by the iPad and the client reported back that the application worked well.
  • Speed of delivery. Accommodating tight deadlines is always troublesome when your a freelance solo developer. I put a lot of time in to the development of this application and often worked late to accommodate changes, I enjoy what I do therefore its not often a problem. The advantage in this project was that it was going to be used in California and since I live in Ireland, i can almost get a full days work in before the guys in California are even out of bed!

Conclusions

Although this project was stressful, its good to see something that I built from scratch being used by such a huge brand name. Its great to look out a dreary, miserable, window in Ireland and look back at your machine to input details of Beverly Hills and Ferraris :)

If you have a web application requirement email me chris@justni.com


19
Jan 11

Facebook applications case study

Got sent this by a potential client today who wants something very similar,  I thought I would share it  It’s one of the best case studies I have seen for Facebook application development and user adoption of a branded application.

I have pitched this idea before to clients and they havent gone for it. Now i have this case study to back up the idea!

I have built similar applications in the past to client specification which didn’t have as many features. If you are a brand would like to work with me on something like this- email me- chris@justni.com I would love to build something like this for a big brand.


15
Jan 11

Tips for being a freelancer

I have been meaning to blog about this for a while, i have pretty much been working as a freelance developer for about a year now and this is a way to document the good, the bad, the highs and the lows.

The do’s

  • Marketing- identify what works best for you, is it networking? Is it cold calling? Is it blogging? for me, its Google Adwords, i pay around $4.50/£3 a click and it gives me a high return and best quality leads. I mainly develop small facebook applications and the return on money spent is around 30 to 1
  • Avoiding procrastination – I worked from home for the most part of the year and eventually went into a shared office space around October. My output went through the roof, I left most of the distractions in my life at home. GET AN OFFICE! I started making lists every morning which is a tip i got from a sales book and it works. Recently speaking to a HR consultant from HandsOnHR.ie who told me, even if he is working from home that day he will still put on a shirt and a tie which puts his mind into work mode.
  • Get to events- you can only learn so much from books and online, getting to talk to other developers or business people can help you develop your skills set while giving your a fresh outlook on things.
  • Learn a framework- This is a developer tip, when I started out i wrote straight php for all the applications and when I recently went to make amendments on code i wrote 10 months ago, my eyes hurt! The code had no order and was poorly structured, I now write all my apps using codeigniter Which gives me a framework to develop  to, using the MVC my code is cleaner, other people can come along and write to the same standard and also means i can reuse a lot of the code.
  • Pricing – put your prices, no matter what you put them up now! Golden rule, unless your being told your too expensive at least once a month your too cheap! Its a harsh reality but higher priced developers arnt always better developers but they are a lot more respected. When i was cheaper… clients seen this as a sign of weakness and I felt they took advantage of my good nature. If they want extra services, charge for it. Its a business your running, not a charity.
  • Identify your ideal customers- a year ago i would have told you my ideal customer/client was someone with money. Now my ideal customer is a design agency who has already sold the application and has all the resources and assets ready for you to go.  Spending a week trying to sell an application to a hotel that have little or no knowledge of the web let alone what you do is wasting your time. Go after the low hanging fruit and gear your marketing around this.
  • Meet people- Some people are just out for themselves and too make a quick buck, but there are many others who are out there to be successful and no better feeling that helping someone else reach success. Finding people who generally want to help you will not only keep you sane but help your business. You can find these at networking groups or events even if they are in a completely unrelated industry to yours, genuine people are in all kinds of businesses. Meeting people can provide support, insights and a fresh prospective on ideas/business

The do not’s

  • Bite of more than you can chew – Find something your good at and work with that, I took on flash work last year which I was going to use to try and learn flash, i spent 6 weeks messing around with flash which got me nowhere and no money.
  • Ignore your instincts- When someone says “I need to get a deposit of my mom” or when a client struggles to come up with a small deposit, walk away, these are nuisance clients who will not respect your time and may not even pay you
  • For the money- I recently talked to students and the message i tried to convey when starting up a business was, don’t just do it for the money. You will be working more hours, working all night and getting yourself nowhere. If you have family and friends, it will strain your relationships and personally I value my friendships more than any money.
  • Let people walk all over you- I was raised to be nice, I was raised to be told what to do and never question anyone. This is not the personality/mentality  you want when your in business. Business can often be ruthless and cruel, live with it, adapt and you will come out the other end stronger. But being self employed and having that freedom can often outweigh any bad points

So to recap on the last year, here’s what the highlights/lowpoints have been for me

Highlights

  • The projects I work on- Some of the work I have done over the last year has been really interesting and pushed my skills to the extreme. From just the normal facebook tab applications to virtual postcards for facebook right through to offline facebook “like” buttons and donation mechanisms through facebook.
  • The people I worked with – In the past year I have worked with some truly inspiring people, not only their drive and determination but just their for being fun and being able to sit on the phone for 20 mins talking about stuff other than work to help realise there is more to life than creating the next killer idea.
  • The people I met- I have met some of the nicest people ever, truly inspirational who I will never do work for but would happily go for a meal or drinks with.
  • The happy customers- Many things have made me smile over the last year including one email from a client that opened with “Dude, i love you” you can’t get much happier than that.
  • Award winning- Although I haven’t won any awards myself, one of my clients has, which is great to know you had an impact on helping their vision gain a  tangible reality.

The low points

  • Not getting paid - This has been a lesson, going back to a point earlier, trust your gut, if something seems fishy accept 100% upfront and no less. Waying up pursuing bad debts is another problem, is there much value in chasing small debts when it costs money and time to do so. Luckily out of about 30 clients only 2 haven’t paid me. Talking over the problem with other businesses, it can be a problem even paying a debt collector when the client actually has no money, you could be wasting money
  • Taking on debt- most businesses need some level of debt to pay people or buy equipment while awaiting getting paid themselves, often an overdraft or credit card can help in this period. But at one point I was about 5k in debt last year and that can be a burden for anyone
  • Being sick- When its just you in a business and you have set deadlines being sick is the worst thing to happen. I have missed opportunities due to having the worst case of the flu in my life. Some people like to think of me as a machine that never breaks down but  but often overworking, late nights mixed with early mornings can affect you mentally and have an impact on your immune system.

Conclusion

I have met some inspirational people, worked on cool stuff and learnt many lessons, but is it really for me? I love coding but I love being out around people. I also spent many years toying with internet marketing and the numbers game being something I enjoyed.

For me to make the most money out of what I do would mean I staying in the office and never leaving. I have met only a few of my clients and I could truely work from anywhere with an internet connection. I often say to people I could work from a tent on top of a mountain. When I start going out to meet clients I am loosing my daily rate, its easier to develop sales and application ideas remotely through skype, over the phone and email. When i do get out for meetings i try to cram in as many in one day as possible

Whats next? I am trying to build a business that encompasses all what I enjoy from networking and being around people to coding and internet marketing. I feel that pushing towards developing a product would do this. therefore I started developing two ideas I had.

First one is a action based crm, a crm that has been stripped to its barebones and a very basic UI. Still in development but 70% there, needs a name though

Second one has a name- http://www.yrecruit.com will be a job search engine providing a better more cost affective experience on both ends. stay tuned.. (Thanks to Mdd.ie for the logo design)


10
Jan 11

A case study into offline facebook apps

Recently i got asked to work on an application that was completely different to anything I had never worked on before, usually the apps i build for clients are quite simple html/php based applications, mixed with a some bending of the facebook api. This time round it was different, it was an offline application that had tangible parts to it, namely RFID cards and readers! This application pushed my skills to the extreme and bent the facebook api.

The where, The When

The application was built to be used at Kiis fm jingle ball 2010

The why?

The application was to allow users to register and then swipe an RFID pass at certain places around the event/venue which would post to their facebook wall.

When users entered the event they where asked to register and allow the application to post to their Facebook wall and also grant the application offline access which meant that the user didn’t have to be logged into Facebook for the application to post to their wall

A user would then move around the venue and event swiping a thumb against a reader which in turn would send a message to the users facebook wall.. every thumb that a user had, had a unique identifier in the form of an RFID to match their facebook details

All wall posts linked back to the Nokia Inside Track Facebook Page therefore every time someone used the app, a message was posted to their wall with a link back to the Nokia Inside track facebook page

The how

A user would be given a thumb, it was designed to match the “like” button that facebook uses

Which would be swiped to read the RFID as they registered and accepted the facebook application which was done at a terminal- This is the screen they where then presented with when they registered to accept the application- This screen was presented to a user on a laptop or tablet and the RFID was passed to the application to identify the user when they moved about

Once a user had registered and accepted the facebook application they would then be allowed to move round the event  and swipe their thumb using a reader at different points of the venue. The reader looked like this-

If you wanted to see what a wall post looked like-this is one below- there was ten different wall posts for the ten different stations about the event.

The numbers

The event ran over two days with about 4 hours each, therefore we had 3692 wall posts in 8 hours

Total Wall Posts : 3692
Total Users : 1167


Conclusion

This was a very interesting project which has gotten a lot of interest to be used again over time for different events and conferences, the client was happy with the results.

If you need a developer for a facebook app- email me- chris@justni.com

The rfid part of the project was carried out by Jason Dean at TheMews.TV


20
Oct 10

10 Cool Facebook infographics

Everyone loves Facebook and everyone loves infographics therefore I thought I would do a post showing some that I found from all over the web. Actually I was researching information for a proposal that I was writing out and I thought it would be a good idea to organise some of the statistics where I could point someone if they asked about Facebook.

This inforgraphic shows some statistics that are out of date but the timeline will not change


Facebook Facts And Figures (JULY 2010)

Somewhere that is going against the trend where the countries population slightly sways to be more female is the maldives-



Maldives on facebook

You can see how people live their life by what age they are using this useful infographic that charts the amount of activities listed by the age group


Activity on Facebook by Age

If you ever wanted to know what makes facebook a business, when will Facebook IPO?



The business behind Facebook

How facebook’s default privacy settings have evolved over time



The changing face of Facebook privacy settings

Another countries geographic stats, this time Mauritius


Facebook Facts & Figures (Mauritius)

Farmville (Facebooks biggest game) Vs Real Farms



“FarmVille” vs. Real Farms

I personally use twitter a lot and its a great way for referrals to take place easily, heres some twitter (Vs facebook) stats



Twitter’s Meteoric Rise

The age distribution on social networks



Social network age distribution

And to finish one, heres one that made me chuckle-



World war 2 on Facebook