Build a motion activated security camera, with WebRTC, canvas and Device Orientation

As a web developer, you’ve probably seen emerging HTML5 technologies and APIs like DeviceOrientation and WebRTC (Web Real Time Communications), and thought “wow they look cool, but they are only for hard core gaming, video conferencing, and other such stuff, not for my every day development”. I’m firmly convinced that taking advantage of these capabilities is going to open up fantastic potential for developers, both for existing web sites, as well as entirely new web experiences. In this article, I want to talk about the latter.

When we first moved into the Web Directions office, we had an old iMac (I mean old) set up as a motion activated security camera. One of the guys who used to share the office with us had built a very simple app that when it detected movement (I’m assuming by analysing images) it sent a photo to a specified email address. Sadly, the Mac and app went when the guy moved out. I say sadly, because a few months back we could really have done with this to help catch whoever came by one night at 3am, smashed in our door, and took several devices.

But then it occurred to me this is something we can build in the browser. All we’d need to do was

  1. Detect motion (with the DeviceMotion API (though it’s a bit more complex than this in practice as we’ll see in a moment)
  2. Capture an image using WebRTC and the HTML5 canvas
  3. Send the image via email (we won’t cover that today, as it is really more a server side issue, but there’s all kinds of ways you could do it) to ourselves.

So, let’s get started. We’ll begin by detecting motion.

Detecting motion

You’re probably thinking, there’s an HTML API for this, DeviceMotion. Which is exactly what I thought. The problem is, while well supported in mobile and tablet browsers (these devices almost universally have gyroscopes for detecting their orientation in 3D space, and accelerometers for detecting their acceleration in 3D as well) it’s not supported in any desktop browser. But, there is a related API, DeviceOrientation which reports the angle at which the device is in 3 dimensions, and which is supported in Chrome, when the laptop it is running on has the sensors to provide this data (I know that the MacBook Pro, but not Air support DeviceOrientation). DeviceMotion and DeviceOrientation work similarly. They both are events sent to the window object when something changes about the device. We can provide event listeners for these events, then respond to the data they provide.

Let’s create event handlers for each of these kinds of event

if (window.DeviceMotionEvent) {
  window.addEventListener('devicemotion', motionHandler, false)
}

else if (window.DeviceOrientationEvent) {
  window.addEventListener('deviceorientation', orientationHandler, false)
}

For each type of event, we make sure that the window object supports the event type, and if it does we add an event listener to the window for the type of event.

Ok, so now our Window can receive these events, let’s look at what information we get from each event, and how we can detect whether the device is in motion.

As mentioned, the most logical way to do so is via DeviceMotion, but here’s the complication. An ideal device for using as a security camera is an old laptop. It’s powered, so the battery won’t go flat, and on tablets, only Chrome for Android supports getUserMedia, for operating the device’s video camera. But, we can use DeviceOrientation to detect motion as we saw on some laptops in Chrome. Let’s do that first, then quickly look at how we can do the same thing for devices which support DeviceMotion events.

Here’s our handler for DeviceOrientation events.

function orientationHandler (orientationData){
  var today = new Date();

  if((today.getTime() - lastMotionEvent) > motionInterval){	
    checkMotionUsingOrientation(orientationData)
    lastMotionEvent = today.getTime()
  }
}

and similarly, our handler for DeviceMotion events

motionHandler: function (motionData){
  var today = new Date();

  if((today.getTime() - lastMotionEvent) > motionInterval){	
    checkMotionUsingMotion(motionData)
    lastMotionEvent = today.getTime()
  }
}

Because DeviceMotion and DeviceOrientation events fire many many times a second, if we were to respond to every single such event, we’d have a very warm laptop, and on battery powered devices, much shorter battery life. So, here we check the current time, and only if the time since we last responded to this event is greater than some interval we respond to the event. Checking for movement a few times every second should be more than adequate.

The event listeners receive deviceOrientation events, with data about the event, including information about the device’s orientation around 3 axes—alpha, beta and gamma.

  • alpha is the device’s rotation around the z axis, an imaginary line extending out vertically from the middle of the device when it is lying flat on its back. In theory, alpha=0 is facing east, 90 is facing south, 180 is facing west, and 270 is facing north, but due to practical reasons, alpha is really only accurate for relative motions, not absolute directions, and so for example can’t be used to create a compass.
  • beta measures the rotation around the x axis, a line horizontally through the device from left to right. 0 is when the device is flat, positive values are the number of degrees that the device is tilted forward, and negative values, the number of degrees it’s tilted backwards
  • gamma measures the device’s rotation around the y axis, a line horizontally along the plane of the devices keyboard (or screen). Positive values at the number of degrees it’s tilted to the right, and negative values, the number of degrees it’s tilted to the left
the device orientation axes

Device Orientation axes, laptop image ©umurgdk

Responding to the event

So, here’s how we’ll respond to the the event, and determine whether the device has moved.

function checkMotionUsingOrientation(orientationData){
  //detect motion using change in orientation
   
  var threshold = .7; //sensitivity, the lower the more sensitive
  var inMotion = false;
  
  var betaChange = orientationData.beta - lastBeta //change in beta since last orientation event
  var gammaChange = orientationData.gamma - lastGamma //change in gamma since last orientation event
      
  inMotion = (Math.abs(orientationData.beta - lastBeta) >= threshold ) || (Math.abs(orientationData.gamma - lastGamma) >= threshold)
  //if the change is greater than the threshold in either beta or gamma, we've moved 

  if (inMotion) {
    //do something because it is in motion
    }
  }
  
  lastBeta = orientationData.beta;
  lastGamma = orientationData.gamma;
  //now we remember the most recent beta and gamma readings for comparing the next time

The orientationData argument is our deviceOrientation event. Along with the sorts of information we’d expect from any event, it has 3 properties, alpha, beta and gamma, with no prizes for guessing what these contain.

What our function does is gets the beta and gamma values from the event, and subtracts the difference from the last time we measured these. If either of these differs by more than some threshold we’ve set (in this case a little under 1 degree) then we’ve detected a movement. We finish by storing the most recent beta and gamma values. We’ve not bothered with alpha values, because Chrome, at present the only browser to report these values on the desktop, doesn’t report alpha values, and because moving a device only around one axis is extremely difficult, so if there’s movement around beta or gamma, then that’s good enough for our purposes. Essentially when the device is lying flat on its back, anyone walking in the vicinity will trigger this event.

How about doing the same thing when device motion events are supported? This time, instead of reporting the devices orientation in space, we get information about its acceleration in each of the same axes, x, y and z.

  • motionData.acceleration.x is the acceleration of the device, in metres per second per second (ms^2), to the right (relative to the device) (so negative values are acceleration to the left)
  • motionData.acceleration.y is the acceleration of the device, in metres per second per second (ms^2), forward (relative to the device) (negative values are acceleration “backwards”)
  • motionData.acceleration.z is the acceleration of the device, in metres per second per second (ms^2), upwards (relative to the device) (negative values are downwards)

Here’s how we’d use this to detect motion.

checkMotionUsingMotion: function(motionData){
  //agorithm courtesy
  //http://stackoverflow.com/questions/8310250/how-to-count-steps-using-an-accelerometer

  var threshold = 0.2;
  var inMotion = false;
  
  var acX = motionData.acceleration.x;
  var acY = motionData.acceleration.y;
  var acZ = motionData.acceleration.z;
  
  if (Math.abs(acX) > threshold) {
    inMotion = true
  }
  
  if (Math.abs(acY) > threshold) {
    inMotion = true
  }  
  
  if (Math.abs(acZ) > threshold) {
      inMotion = true
  }

  if (inMotion) {
    //do something because it is in motion

  }
}

Here we take the acceleration in each axis, and if any of these is greater than a threshold amount (to ensure we don’t get false positives) then we’re in motion. You can see it’s a little simpler than using deviceOrientation, as we don’t need to calculateany change.

Taking the photo

So now we can detect when the device is moving, we want our security camera to take a photo. How are we going to do this? Well, one feature of WebRTC is the ability to capture video with a device’s video camera. At present, this is supported in Firefox and Chrome on the desktop, and the Blackberry 10 Browser (which also supports devicemotion events, so your Blackberry 10 phone or Playbook can serve as a security camera if you need it!), as well as Chrome for Android (though you need to enable it with chrome://flags). WebRTC is a very powerful API, but we’re only going to need a small part of it.

We’ll use the getUserMedia method of the navigator object. This takes an options object, as well as a success and a failure callback function as its arguments.

var options = {video: true};
navigator.getMedia(options, gotVideoStream, getStreamFailed);

Our options variable is a simple object, here we just set its property video to true (if we wanted audio we’d also set an audio property to true).

We’ve also passed it two callback functions, gotVideoStream, which will be called once a video stream is available, and getStreamFailed, which is called if we don’t get a video stream (for example, if the user refuses the browser’s request to use the video camera). getUserMedia uses callbacks, rather than returning a value, because it takes time for the user to choose whether to allow video to be enabled, and as JavaScript is single threaded, this would block our UI while the user waited.

Next, let’s use video stream.

function gotVideoStream(stream) {
  var videoElement = document.querySelector("video");
  videoElement.src = window.URL.createObjectURL(stream);
}

OK, there’s a bit going on here, so let’s take it one step at a time. Navigator calls our callback function, passing an argument stream. This is a MediaStream object. We then use the createObjectURL method of the window’s URL object to get a URL for the stream (this way we can then make this URL the value of the src attribute of a video element, then this video element will show the output of our camera in real time!).

So, we’ve now got a working video camera, that shows the video feed from our devices camera in a web page. No servers, no plugins! But we still don’t quite have our security camera. What we need to do is take a snapshot from the video stream, when we detect movement. So, let’s first take the snapshot

Taking a snapshot from the video element

Here we’ll take a snapshot of the video element at a given time. Note this works regardless of what’s playing in the video element (so you can do a screen grab of anything playing in an HTML5 video element like this). Ready?

function takeSnapshot(){
	var canvas = document.querySelector("canvas");
  var context = canvas.getContext('2d');
  var video = document.querySelector("video");
  context.drawImage(video, 0, 0);
}

Here’s what we’re doing

  • we get a canvas element from the page
  • we get its 2D drawing context
  • we get the video element from the page
  • we use the drawImage method of the canvas to draw the video into the canvas starting at (0, 0) (the top left of the canvas).

Yes, it really is that easy. Just as you can use canvas.drawImage with an img element, we can use it with a video element.

Now we’ve got all the pieces, let’s put them together to create our security camera.

Remember this part of our motion detection functions?

if (inMotion) {
  //do something because it is in motion
}

This is where we call takeSnapshot, and then the current frame in the video element will be captured to a canvas element. You could also save this in localStorage, or send it via email to someone, or otherwise do something with the image. I’ll leave those parts to you.

And that’s really all there is to it.

I’ve also got a fully working version available on github. It’s a little more complicated to read through than the code here, but it’s copiously commented, and the basic working code is the same. Or you can see it in action here (just make sure you use Chrome with a device that supports orientation events, and has a webcam).

Notes for those following along

Note though, to make it work from your local drive, you’ll need to run it through a webserver (Chrome won’t enable the camera from file:// although Firefox will). You’ll also need a device that supports either device orientation or device motion events, which to my knowledge currently means only a MacBook Pro (not MacBook Air).

Links for further reading

Som more reading on the various features we used to build our security camera.

109 responses to “Build a motion activated security camera, with WebRTC, canvas and Device Orientation”:

  1. […] Build a motion activated security camera, with WebRTC, canvas and Device Orientation | Web Direction… – I just built a motion activated security camera using only a browser. Here’s how […]

  2. Good read. I think there’s a bug in your checkMotionUsingOrientation() function. Shouldn’t the motionDetector.lastBeta and motionDetector.lastGamma only be updated if inMotion == true? Otherwise, the person could infinitely move under the threshold, and the callback would never be fired. Here’s an updated function, sans comments:


    checkMotionUsingOrientation: function(orientationData){
    var threshold = .7,
    betaChange = Math.abs(orientationData.beta - motionDetector.lastBeta),
    gammaChange = Math.abs(orientationData.gamma - motionDetector.lastGamma);
    if((betaChange >= threshold ) || (gammaChange >= threshold)) {
    if(motionDetector.callback) motionDetector.callback();
    motionDetector.lastBeta = orientationData.beta;
    motionDetector.lastGamma = orientationData.gamma;
    }
    }

    And is there a reason the threshold is different in checkMotionUsingOrientation() vs checkMotionUsingMotion(). If they should be the same, might want to make that a property of the motionDetector JSON object.

  3. Follow up from my last comment, assuming “threshold” becomes a property of the motionDetector JSON object, here are updated functions for checkMotionUsingOrientation() and checkMotionUsingMotion():


    checkMotionUsingOrientation: function(orientationData){
    var betaChange = Math.abs(orientationData.beta - motionDetector.lastBeta),
    gammaChange = Math.abs(orientationData.gamma - motionDetector.lastGamma);
    if((betaChange >= motionDetector.threshold ) || (gammaChange >= motionDetector.threshold)) {
    if(motionDetector.callback) motionDetector.callback();
    motionDetector.lastBeta = orientationData.beta;
    motionDetector.lastGamma = orientationData.gamma;
    }
    },
    checkMotionUsingMotion: function(motionData){
    var acX = Math.abs(motionData.acceleration.x),
    acY = Math.abs(motionData.acceleration.y),
    acZ = Math.abs(motionData.acceleration.z);
    if((acX > motionDetector.threshold) || (acY > motionDetector.threshold) || (acZ > motionDetector.threshold)){
    if(motionDetector.callback) motionDetector.callback();
    }
    }

  4. […] Direct Link to Article — Permalink […]

  5. This looks really interesting, i haven’t seen anything like this before but im definitely going to look into it more.

    I knew HTML5 was more advanced but i had no idea it could do motion activated security camera lol. Thanks.

    • By: Aeip
    • June 10th, 2013

    Where are the photos saved?

  6. […] requestAnimationFrame and Build a motion activated security camera, with WebRTC, canvas and Device Orientation (Chris […]

  7. […] John Allsopp shows how he built a browser-​​based security application using the  DeviceMotion API, WebRTC and canvas. Build a motion activated security camera, with WebRTC, canvas and Device Orientation […]

    • By: Alex
    • June 11th, 2013

    Where and how are the images saved? Can I view the live stream from another computer at home?

    • By: John
    • June 11th, 2013

    Hi,

    thanks for the comments!

    At present, the images aren’t saved anywhere — but you could easily save them to localStorage. And with a bit more effort, send them to a server, or email them

    You could also use WebRTC to livestream to any other computer that is running a browser that supports WebRTC quite readily — just look for tutorials on webRTC.

    Justin,

    good catch, though I don’t think in practice it’s much of an issue — any motion that triggered the algorithm is quite fast and probably quite a bit larger than the threshold — 200ms is a long time to move a tiny fraction of a degree

    j

  8. Wow! That’s cool. I want to go deep.

    • By: Scott B
    • June 20th, 2013

    I don’t think your battery-​​saving efforts are doing anything. The browser is still going to fire the motion/​orientation events, and execute your handler on every change, even if the handler doesn’t do much.

    It’d be much more effective to have the handler remove itself from the event chain and set a timer that fires after the motionInterval has elapsed that re-​​attaches it. With nothing listening for the event, the browser should be able to power off the accelerometer/​gyroscope and even sleep the processor, if the interval is long enough.

  9. I know what im going to have a play with at the weekend now, this could proove to be hours of fun at work, capturing every body slacking!

    • By: John
    • June 28th, 2013

    Thanks Scott,

    I’ll look more into how to reduce the impact of the event listening on battery life.

    john

  10. […] covered DeviceMotion and DeviceOrientation in some detail recently when I built a motion activated security camera in the browser, so we’ll not go into the details of DeviceOrientation here. In short […]

    • By: Radhakrishna
    • July 8th, 2013

    Great blog, I was thinking of a scenario, when motion have to be split, or measured in some units. First of all, is this possible? Thanks

  11. […] Want to get started with webRTC, you might be interested in our recent article, where we built a motion activated security camera in the browser with webRTC. […]

  12. hello there and thank you for your info – I’ve definitely picked up anything new from right here. I did however expertise some technical points using this web site, as I experienced to reload the web site lots of times previous to I could get it to load correctly. I had been wondering if your web hosting is OK? Not that I’m complaining, but sluggish loading instances
    times will sometimes affect your placement in google and could damage your high-​​quality score if advertising and
    marketing with Adwords. Anyway I am adding this RSS to my email and could look out for much
    more of your respective intriguing content. Make sure you update this again
    soon.

  13. Thanks a lot for sharing this with all people you actually
    understand what you are talking about! Bookmarked.
    Kindly also seek advice from my site =). We could have a link alternate contract among us

  14. It is not hard to do, and you need to take your thyroid seriously in order to achieve this, with quail eggs.
    Excess tarter health causes red, swollen, and receding gums which can be made into a
    delicious meal, and the ability to hang towels there and grab onto them
    in an emergency. They, too, have the health benefits of the Moringa Oleifera
    plant are said to aid with over three hundred diseases.
    Like water, the use health of water to cleanse internally without the use of cola
    beverages.

  15. […] After the break, with drinks and food courtesy of SilverStripe, Damon Oehlman showed us how to Ride the Web RTC Wave, And Not Drown in the Swell. WebRTC is both cool and hot, once you have checked out What is WebRTC, get ready to dive into the spec to really see what is happening in the space. And for a bit of fun and just one idea of the possibilities in this exciting area, check out John’s tutorial Build a motion activated security camera, with WebRTC, canvas and Device Orientation. […]

  16. I almost never leave responses, however after reading a few of the remarks on this page Build a motion activated security camera, with
    WebRTC, canvas and Device Orientation | Web Directions.
    I actually do have a few questions for you if it’s okay.
    Is it only me or do a few of the responses come across as
    if they are written by brain dead individuals? :-P And, if you are posting on other places, I’d like to follow anything
    fresh you have to post. Would you list of the complete urls
    of your social networking pages like your Facebook
    page, twitter feed, or linkedin profile?

  17. Amazing! This blog looks exactly like my old one!

    It’s on a completely different topic but it has pretty much the same page layout and design.
    Excellent choice of colors!

  18. Amazing! This blog looks exactly like my old one!
    It’s on a completely different topic but it has pretty much
    the same page layout and design. Excellent choice of colors!

  19. Thanks for sharing this post.I am happy to buy this security camera.It completely secured me from everything.

  20. I have been browsing online more than three hours nowadays, but I by no means discovered any attention-​​grabbing article like yours.
    It is pretty worth enough for me. Personally, if all webmasters and bloggers made good content as you probably did, the
    net shall be a lot more helpful than ever before.

  21. For latest information you have to visit web and
    on web I found this web site as a finest web site for latest updates.

  22. Good read. like ur perspective

  23. Good read. like ur perspective

  24. Fine way of describing, and nice piece of writing to take data about my presentation topic, which i am going to convey in school.

  25. Fine way of describing, and nice piece of writing to take data about my presentation topic, which i am going to convey in school.

  26. There is certainly a lot to know about this topic. I like all the
    points you have made.

  27. I have been surfing online more than 3 hours today, yet I
    never found any interesting article like yours. It is
    pretty worth enough for me. Personally, if all website owners and bloggers made good
    content as you did, the internet will be a lot more useful than ever before.

    • By: Rob
    • November 16th, 2013

    I wonder who’s going to use this instead of ($50-$150 USD) IP-​​cams that already have motion detection build in and can email/​FTP images and/​or video footages.

    Are there people who rather keep their computer or laptop running 24/​7 to be able to running this HTML5 script in their browser for motion detection, which is even more expensive and wasting energy?

  28. I think this is one of the most vital info for me.
    And i’m glad reading your article. But want to remark
    on some general things, The website style is great, the articles is really nice : D.
    Good job, cheers

  29. I think this is one of the most vital info for me.
    And i’m glad reading your article. But want to remark
    on some general things, The website style is great, the articles is really nice : D.
    Good job, cheers

  30. Hi, for all time i used to check weblog posts here early in the break of day, as i like to learn more
    and more.

  31. I have a notable analytical eye meant for details and may anticipate issues prior to they will
    occur.

  32. When I initially commented I appear to have clicked the –Notify me when new comments are added– checkbox
    and now each time a comment is added I recieve four emails with the exact
    same comment. Is there a way you can remove me from that service?
    Cheers!

  33. I think everything posted was very logical. But, consider this, what if
    you were to write a killer headline? I ain’t suggesting your content is
    not good., however what if you added something that grabbed people’s attention?
    I mean Build a motion activated security camera, with WebRTC, canvas and Device Orientation | Web
    Directions is a little boring. You could look at Yahoo’s front page and watch how they create post titles
    to get viewers to click. You might try adding a video or a picture or two
    to get people interested about what you’ve got to say.
    Just my opinion, it would make your blog a little bit more interesting.

    • By: javni
    • November 29th, 2013

    Hey! I just wanted to ask if you ever have any
    issues with hackers? My last blog (wordpress) was hacked and I ended
    up losing months of hard work due to no data backup.

    Do you have any methods to stop hackers?

  34. Hmm is anyone else experiencing problems with the images on this
    blog loading? I’m trying to find out if its a problem on my
    end or if it’s the blog. Any feedback would be greatly appreciated.

  35. I visited many blogs except the audio quality for audio songs present
    at this web site is in fact superb.

  36. Just wish to say your article is as astonishing. The clarity
    in your post is simply spectacular and i can assume you’re an expert on this subject.
    Well with your permission let me to grab your feed to keep updated with forthcoming post.
    Thanks a million and please carry on the rewarding work.

  37. Somebody necessarily help to make severely articles I
    might state. This is the very first time I frequented your
    web page and so far? I amazed with the analysis you made to create
    this particular submit incredible. Excellent activity!

  38. I blog frequently and I seriously appreciate your information.

    The article has really peaked my interest. I am going to bookmark your
    blog and keep checking for new information about once
    a week. I subscribed to your Feed as well.

  39. Another kind of a low credit score loan might be acquired
    from some banks and purchaser loan firms. You can delay it even when
    you’re in some financial difficulty. One cannot change the indegent or
    low credit score history overnight but there exists a possibility to come home inside company of the SUV how the user wished.

  40. Its such as you read my thoughts! You appear to know a lot approximately this, such as you wrote
    the e-​​book in it or something. I believe that you simply could do with some p.c.
    to force the message house a little bit, however instead of that, this is wonderful blog.
    A great read. I will definitely be back.

  41. Beginning this year, many have continued to develop merchandise, latest autumn
    and winter as a bag accessories. With this new appreciation of Kimchi and Korean cuisine, a number of Americans are also starting to warm up to
    fermented food generally, such as sauerkraut. Pusan, the largest seaport in the country, has several
    places of tourist attraction such as Pornosa Temple, Kumjongsansong Fortress, natural hot springs and much more.

  42. The very best minecraft server hosting on the world wide web.
    High quality host packages giving you a fantastic knowledge and it’s totally free.

    Our net servers are all linked to these one hundred Mbps ports, which is then related to the datacentre backbone, able of up
    to the great 90 Gb for each second bandwidth!
    Our web servers are all connected to these a hundred Mbps ports, which
    is then linked to the datacentre spine, capable of up to
    the cool ninety Gb for each next bandwidth!
    Our web servers are all linked to these a hundred Mbps ports, which is then connected to
    the datacentre backbone, able of up to the cool ninety Gb for every second bandwidth!

    So, why ProMinecraftHost? Simply because we have all-​​inclusive rates and unbeatable benefit
    Other companies promise inexpensive hosting, but then demand additional for setup expenses, higher renewal
    costs, or promotional services.

  43. Hello, I think your blog might be having browser compatibility issues.
    When I look at your blog site in Safari, it looks fine but when opening in Internet
    Explorer, it has some overlapping. I just wanted to give you a quick
    heads up! Other then that, excellent blog!

  44. These memberships allow members to obtain additional information about Korean politics, experts and institutions.
    The jetliner exploded over Burma, killing all 115 people aboard.

    Pusan, the largest seaport in the country, has several places
    of tourist attraction such as Pornosa Temple,
    Kumjongsansong Fortress, natural hot springs and much more.

  45. My brother suggested I would possibly like this web site.
    He was once entirely right. This put up truly made my day.

    You can not believe simply how a lot time I had spent for this info!
    Thank you!

  46. Howdy! Someone in my Facebook group shared this site with us so I came to check it out.
    I’m definitely loving the information. I’m bookmarking and will be
    tweeting this to my followers! Superb blog and brilliant
    design and style.

  47. Hello, i think that i saw you visited my website thus i came to “return the favor”.I am attempting to find
    things to enhance my website!I suppose its ok to use some of your ideas!!

  48. It’d be much more effective to have the handler remove itself from the event chain and set a timer that fires after the motionInterval has elapsed that re-​​​​attaches it. With nothing listening for the event, the browser should be able to power off the accelerometer/​​gyroscope and even sleep the processor, if the interval is long enough.

  49. I’m impressed, I have to admit. Seldom do I encounter a blog that’s
    both equally educative and amusing, and let me tell you, you have hit the nail
    on the head. The problem is something not enough men and women are speaking intelligently about.

    I am very happy that I came across this during my hunt
    for something relating to this.

    My blog post; Nude Lipstick

  50. Yesterday, while I was at work, my sister stole my iphone and tested to see if it can survive a forty foot drop,
    just so she can be a youtube sensation. My iPad is now destroyed and she has 83 views.
    I know this is totally off topic but I had to share it with someone!

    • By: bike
    • December 12th, 2013

    Everything is very open with a precise clarification of the challenges.
    It was really informative. Your website is very useful.
    Thanks for sharing!

  51. It offers products that are formulated with
    100% natural herb, which is exceptional, in essence, safety,
    value, benefits and results. One simple way to do this is with targeted advertising.

    Now you are even more confused and probably terribly irritated.

  52. It’s an awesome paragraph in support of all the web
    visitors; they will obtain advantage from it I am sure.

  53. Hi, Neat post. There is an issue along with your site in
    internet explorer, might check this? IE still is the market chief and a large element of people will leave out your great writing due to this problem.

  54. schede elettroniche online sembrano proprio come
    quelli tradizionali . Ecco i Top Ten regali di Natale per
    le donne , si può tirare alcune idee fuori di
    questa lista per il tuo shopping di Natale . 100 % di Natale — i più grandi artisti 100 Hits di Various Artists (
    2011) — Non si può mai andare storto con i grandi come ,
    Bing Crosby , Nat ” King” Cole , Perry Como , Doris Day ,
    Sammy Davis Jr

  55. I don’t know if it’s just me or if perhaps everybody else experiencing issues with your site.
    It looks like some of the text within your content are running off the screen.
    Can someone else please provide feedback and let me know if this is happening to them
    too? This could be a problem with my web browser because I’ve had this happen previously.

    Appreciate it

  56. I loved as much as you’ll receive carried out right here.
    The sketch is tasteful, your authored subject matter stylish.

    nonetheless, you command get bought an edginess over that
    you wish be delivering the following. unwell unquestionably come more formerly
    again as exactly the same nearly very often inside case you shield this increase.

  57. What’s Taking place i’m new to this, I stumbled upon this I have discovered It absolutely useful and it
    has helped me out loads. I am hoping to give a contribution & aid different customers
    like its aided me. Great job.

  58. What’s Taking place i’m new to this, I stumbled upon this I have discovered It absolutely useful and it
    has helped me out loads. I am hoping to give a contribution & aid different customers
    like its aided me. Great job.

  59. I don’t leave many remarks, however I browsed a great deal
    of responses on Build a motion activated security camera, with WebRTC, canvas and Device Orientation | Web Directions.
    I actually do have a couple of questions for you if it’s okay.

    Could it be simply me or does it seem like a few of the remarks look as if they are
    coming from brain dead visitors? :-P And, if
    you are writing at additional online sites, I would like to keep up with everything fresh you have to post.
    Could you post a list of all of all your shared
    pages like your Facebook page, twitter feed, or linkedin profile?

  60. I don’t leave many remarks, however I browsed a great deal
    of responses on Build a motion activated security camera, with WebRTC, canvas and Device Orientation | Web Directions.
    I actually do have a couple of questions for you if it’s okay.

    Could it be simply me or does it seem like a few of the remarks look as if they are
    coming from brain dead visitors? :-P And, if
    you are writing at additional online sites, I would like to keep up with everything fresh you have to post.
    Could you post a list of all of all your shared
    pages like your Facebook page, twitter feed, or linkedin profile?

    • By: Kim
    • January 8th, 2014

    You should take part in a contest for one of the finest blogs online.
    I will recommend this web site!

  61. Link exchange is nothing else but it is just placing the other person’s website link on your page at proper place and other
    person will also do similar in support of you.

  62. Hi! This is my first comment here so I just wanted
    to give a quick shout out and say I genuinely enjoy reading your articles.
    Can you suggest any other blogs/​websites/​forums that cover the same
    topics? Appreciate it!

  63. I got this website from my friend who shared with me regarding this site and now this time
    I am browsing this web site and reading very informative articles
    at this time.

  64. I got this website from my friend who shared with me regarding this site and now this time
    I am browsing this web site and reading very informative articles
    at this time.

  65. Normally I don’t learn article on blogs, but I would like to say that this write-​​up very forced me to check out and do so!

    Your writing taste has been amazed me. Thanks, quite nice article.

    • By: Elias
    • January 15th, 2014

    Great info. Lucky me I founԁ your blog bу
    accidsnt (stumbleupon). Ι’ve book-​​marked it
    for later!

    Also visit my site; bridesmaids dresses, Elias,

  66. That looks similar to my own enclosure my Partner and I purchased recently, very happy with it for everyone found on the fence on the
    subject of buying one, do it now, you will not regret it

    • By: Bruce
    • January 21st, 2014

    Post writing is also a excitement, if you be familiar with
    after that you can write or else it is complicated to write.

  67. Water often is used as a base for your favourite low
    carb smoothie; it owns the minimum amount of carbs of most
    –infact zero. Combine ingredients in blender and
    blend until frothy and smooth. For this most basic mango recipe, you only
    need a cup of chopped mango, a cup of vanilla yogurt, a cup of crushed ice, and a tablespoon of sugar
    (optional since the mango is already ripe in itself).

  68. Excellent post however , I was wondering if you could write a
    litte more on this subject? I’d be very grateful if you could elaborate
    a little bit more. Appreciate it!

  69. Great web site. Plenty of helpful info here. I’m sending it to several friends ans additionally sharing
    in delicious. And of course, thanks to your sweat!

  70. Great web site. Plenty of helpful info here. I’m sending it to several friends ans additionally sharing
    in delicious. And of course, thanks to your sweat!

  71. I need to to thank you for this very good read!!

    I certainly loved every bit of it. I have you saved as a favorite to
    look at new things you post…

    • By: new
    • January 24th, 2014

    Hello it’s me, I am also visiting this website regularly, this
    website is in fact pleasant and the people are genuinely sharing fastidious thoughts.

    • By: new
    • January 24th, 2014

    Hello it’s me, I am also visiting this website regularly, this
    website is in fact pleasant and the people are genuinely sharing fastidious thoughts.

  72. I was recommended this web site via my cousin. I’m now not certain whether or not this publish is written by way of him as no one else recognize such special approximately my trouble.

    You’re amazing! Thanks!

  73. Howdy very nice blog!! Guy .. Excellent .. Superb .. I will bookmark your website and take the feeds also?

    I am glad to find numerous helpful information here within the post, we need develop extra techniques in this regard,
    thank you for sharing.… . .

  74. Howdy very nice blog!! Guy .. Excellent .. Superb .. I will bookmark your website and take the feeds also?

    I am glad to find numerous helpful information here within the post, we need develop extra techniques in this regard,
    thank you for sharing.… . .

  75. I feel this is one of the such a lot significant info for me.
    And i am glad studying your article. However wanna
    commentary on few common things, The site style is great, the articles is truly excellent :
    D. Excellent activity, cheers

  76. I feel this is one of the such a lot significant info for me.
    And i am glad studying your article. However wanna
    commentary on few common things, The site style is great, the articles is truly excellent :
    D. Excellent activity, cheers

  77. Its like you read my mind! You seem to know a lot about this, like you
    wrote the book in it or something. I think that
    you can do with a few pics to drive the message home a bit,
    but other than that, this is excellent blog. An excellent read.
    I will definitely be back.

  78. Its like you read my mind! You seem to know a lot about this, like you
    wrote the book in it or something. I think that
    you can do with a few pics to drive the message home a bit,
    but other than that, this is excellent blog. An excellent read.
    I will definitely be back.

  79. If you desire, it is possible to choose one of the Las Vegas hotels as the setting to your Las
    Vegas NV big event, reception and honeymoon. So far, reactions to the acquisition,
    as well as towards the announcement with the new
    business model, have been mixed, but only time will tell whether or not really a revamped version of the massively popular peer-​​to-​​peer website will probably
    be as successful since its predecessor. Now, movies aren’t the thing that piracy trackers allow links too.

  80. I love what you guys are usually up too. This sort of
    clever work and coverage! Keep up the superb works
    guys I’ve included you guys to my blogroll.
    \

    • By: Hack
    • March 9th, 2014

    Good article, keep it up :)

  81. I do not even know how I ended up here, but I thought this
    post was great. I don’t know who you are but certainly you’re going
    to a famous blogger if you are not already ;) Cheers!

  82. Hey just wanted to give you a quick heads up. The text in your post
    seem to be running off the screen in Firefox. I’m not sure if this is a formatting
    issue or something to do with web browser compatibility but I thought I’d
    post to let you know. The style and design look great though!
    Hope you get the problem resolved soon. Cheers

  83. They are, in my humble opinion, one of the most fun and creative Facebook Business Page features
    and something else that a Facebook Profile cannot offer. While it may be difficult at first, take some time away
    from the site. I refreshed the page a few times to get a feel for the
    rate of growth and gauged that over 100 new fans
    were joining the page each second.

  84. Because they make you sad, and they make you think about what a
    bad friend you are for not checking on her more often, and they make you think about
    the people you’ve recently lost, and they make
    you not want to check Facebook for the next month to avoid seeing similar updates.

    More and more business owners are starting to use Facebook to reach potential clients and customers.
    But spend the majority of your time concentrating on building a strong, positive
    image of you.

  85. Because they make you sad, and they make you think about what a
    bad friend you are for not checking on her more often, and they make you think about
    the people you’ve recently lost, and they make
    you not want to check Facebook for the next month to avoid seeing similar updates.

    More and more business owners are starting to use Facebook to reach potential clients and customers.
    But spend the majority of your time concentrating on building a strong, positive
    image of you.

  86. We’re a group a group of volunteers and starting a
    new scheme in our community. Your website provided us with valuable information and
    work on . You a formidable task and our all the community will probably
    be grateful to you .
    Undeniably Account that you said .
    Your favorite justification seemed to be on the net
    easy factor to take note of . I tell you , i definitely
    get annoyed at the same time while others folks
    think concerns just do not realize about . You controlled
    and defined everything managed to hit the nail on the top no need
    side-​​effects , other folks cAN could take a signal.
    Will likely be back to get more. Thank you

    My web blog; monster warlord hack

  87. Thanks for ones marvelous posting! I certainly enjoyed reading it, you’re a great author.I will remember to bookmark your blog and will eventually
    come back from now on. I want to encourage you to ultimately
    continue your great writing, have a nice weekend!

  88. We are a group of volunteers and starting a brand new scheme in our community.
    Your web site offered us with helpful helpful
    information and work on . You made ​​an impressive
    task and our whole neighborhood be thankful to you .

    Definitely imagine that you stated . Your favorite
    justification seemed to be on the web easy
    factor to have in mind of . I tell you , i certainly get annoyed same as
    any other people others folks think worries
    clear that not realize about . You controlled
    and also defined everything managed to hit the nail
    on the top no need side-​​effects , people could take a signal.

    Will probably be back to get more. Thanks

    Feel free to surf to my weblog — download photoshop

  89. We’re a group a group of volunteers and opening a brand new
    scheme in our community. Your website provided us with valuable information
    and work on . You made ​​an impressive task and our all the community
    be thankful to you .
    Unquestionably believe which you stated .
    Your favorite justification appeared to be on the internet
    simple factor to account of . I tell you ,
    i certainly annoyed at the same time while others folks think concerns clear that not
    recognize about . You controlled and out everything managed to hit
    the nail on the top without having side-​​effects , others
    cAN could take a signal. Will probably be again to get more.
    Thanks

    My webpage; hack Game of war fire age

  90. We are a flock a group of volunteers and starting a new scheme in our community.
    Your website offered us with helpful helpful information
    and work on . You have a formidable activity and our all
    the group will likely be thankful to you .

    Undeniably Account which you stated . Your favorite reason appeared to
    be at the internet easy factor to be mindful of .

    I tell you , i certainly annoyed people
    think concerns clear that not recognize about .
    You controlled and also defined on all managed to hit the
    nail on the top no need side effect , others cAN
    could take a signal. Will probably be back to get more.
    Thanks

    Also visit my web blog :: Dragon Story Cheats

  91. We are a flock a group of volunteers and starting a new scheme in our community.
    Your website offered us with helpful helpful information
    and work on . You have a formidable activity and our all
    the group will likely be thankful to you .

    Undeniably Account which you stated . Your favorite reason appeared to
    be at the internet easy factor to be mindful of .

    I tell you , i certainly annoyed people
    think concerns clear that not recognize about .
    You controlled and also defined on all managed to hit the
    nail on the top no need side effect , others cAN
    could take a signal. Will probably be back to get more.
    Thanks

    Also visit my web blog :: Dragon Story Cheats

  92. One is expensive but that wireless headphones is the perfect length.

    Sound reproduction is average, but the headphones are very useful in situations such as when travelling on planes, buses, and trains.
    The products listed below are reviewed with a high definition technology and music experience.
    There are also wireless is the reason why folks confuse the two words and consequently the headphones.
    This isn’t a problem, and here in Silicon Valley some of the
    best noise cancellation.

  93. One is expensive but that wireless headphones is the perfect length.

    Sound reproduction is average, but the headphones are very useful in situations such as when travelling on planes, buses, and trains.
    The products listed below are reviewed with a high definition technology and music experience.
    There are also wireless is the reason why folks confuse the two words and consequently the headphones.
    This isn’t a problem, and here in Silicon Valley some of the
    best noise cancellation.

  94. We are a group of volunteers and opening a new scheme in our community.
    Your website offered us with helpful helpful and paintings on .
    You have made ​​an impressive job and our whole neighborhood
    will probably be thankful to you .
    Unquestionably imagine which you said .
    Your favorite reason seemed to be on the net easy
    thing to understand of . I tell you , i certainly
    get annoyed same as any other people think concerns
    clear that just do not realize about . You controlled
    and also defined on all managed to hit the nail on the top without having side-​​effects , others
    could take a signal. Will likely be back to get more.
    Thank you

    Visit my web site … criminal case cheats

Your opinion:

XHTML: You're allowed to use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>