Replica set involves at least 3 instances of Mongo running with respect to voting so that any one server can take over as master in case of failure. So first thing is to install mongo in 3 servers in your network which is a good idea for redundancy. You can easily install mongo by following instructions at mongodb documentation site. In this blog we will be deploying mongo db replica set in linux environment.

Once you have completed installation of mongo, it’s time for some configuration tweaks before you start the databases. But first generate a key file in your master instance for authentication so that the 3 mongo instance can talk to each other securely. 

openssl rand -base64 741 > /etc/mongo.key

Copy the key file in your other instances in same location.

Now edit the following in all of the 3 mongo DB /etc/mongo.conf

keyFile=/etc/mongo.key
replSet=rs0 #[unique name for your set]
rest=true # if you want rest api to view status of your mongodb

Note: auth=true only works for single mongodb instance authentication, keyFile is required for replica or sharding authentication setup.

Now start your mongo db process

service mongod start

start interactive mongo to initiate the replication and setup replication configuration

mongo
>rs.initiate()
# will return no configuration found
> config = {_id: rs0, members:[{_id:0, host: 'ip:port'},{_id:1, host: 'ip:port'},{_id:2, host: 'ip:port'}]}
>rs.initiate(config)
# will return success status
> exit

that’s it! you have setup mongo DB replica set with authentication.

Advertisements

I had been really lazy to write this blog to finish off the thor application example. So I’ll just go right to the application, it’s nothing complicated. This application intends not to tweet actually in twitter but to demonstrate how thor tasks work.

So where I left from last post add a new folder bin in your application root and create a file tweet. This is going to be our executable file which will allow us to do something like,


tweet post hello

and will print You tweeted: hello.

Put the following in your bin/tweet file,


#!/usr/bin/ruby

require "tweet"

Tweet.start # this registers the thor class as task

Now install build and install the gem by executing ‘rake install’ command in application root. It will install the executable as well. So that’s it, the code can be downloaded from https://github.com/mftaher/Tweet-Thor. You can use it as a basic structure to create your own executable thor tasks.

Note: Before you install or build the gem always commit your git changes.

Ruby is a a wonderful language, you can never stop praising what it lets you do and help you create great applications. To eliminate the need to copy my initial application structure every time I decided to write a scaffolding application in ruby that will give me an initial structure with necessary files in it just like rails generator (I use Sinatra micro web-framework for ruby web development).

I had been researching many options out there to accomplish this and ruby gives you not only wide range of options but also quickest turn around time for a command line application. To name a few the ruby core OptionParser is a powerful class to begin with, there is also Trollop, of course rake and there’s Thor that replaces rake, sake and rubigen.

A great advantage with Thor is, it documents your command line tool as you develop. Thus makes it easy for the developers create several tasks with plenty options and documenting at the same time. So I thought this reason is good enough to build my application using Thor then the others.

Instead of doing a hello world application, I’m going to demonstrate a simple tweeting application using thor. First you’ll need to have a structure of your application you can easily get it by doing:

bundle gem tweet

You will get the default app structure provided by bundle which can be used to publish your own gem. Then create and edit tweet.thor in your project lib diretory:

class Tweet > Thor
  desc "post MESSAGE", "Tweet message in your command line"
  def post(message)
    puts "You tweeted: #{message}"
  end
end

You should be able to see the task list typing `thor -T`.

To make the command available in your terminal, we’ll cover that in next blog post when we will actually post a tweet.

Switching to Ruby from PHP wasn’t as hard as deploying rails/sinatra app on existing Apache-PHP environment. It should’ve been fairly easy as I choose to do it with Phusion Passenger instead of using Proxy to the rails/sinatra app. But who knew things can get really ugly if I hadn’t tested locally.

Problem Ughhh @#$@%@:

Actually I deployed a rails/sinatra app in production first then was trying to configure in my localhost but then figured out when passenger module is loaded DirectoryIndex index.php isn’t working, meaning index.php of any web application wasn’t recognized by apache by default anymore as before you have to type it in the browser. Digging deeper found out mod_dir is not compatible with phusion passenger offering no fix yet. You might want to check with conflicting apache module with phusion passenger before even trying to install passenger in your existing apache-php environment.

Avoid Catastrophe:

The reason why I did not notice it in my production environment at first because of cache. Once I tried to deploy in my local machine things aren’t working as it was in production. I had to type in index.php to gain access. Checked AddHandler, AddType, DirectoryIndex index.php everything in place and nothing seems to work until I found the conflicting apache modules.

Solution:

There’s a workaround provided by the Passenger team i.e. using PassengerEnabled off. After Passenger module is loaded you can turn it off so that mod_dir can do it’s job setting correct DirectoryIndex, and then enable it where Phusion Passenger is required, preferable inside rails/sinatra app  <Directory> block. If you put it outside it may globally configure which will again make mod_dir not to work. Only when an agent is requesting for the rails/sinatra app it gets turned on for that Directory block and there’s no conflict anymore. A good example is provided at Phusion Passenger Guide. This setting can be done otherway around depending on the number of rails/sinatra and php application you have running in your environment.

Still waiting for something to go wrong just hoping it happens in my local machine ealier.

Local Environment:

Mac OS X Lion 10.7.2 , built in apache2, php5.3.6., rvm 1.10.0, ruby 1.9.2, passenger 3.0.11

I have been developing a web application in Sproutcore framework. It’s a great framework to develop. I have integrated with facebook login, like button and thought may be great idea to add google +1 button.

At first I thought it should be an easy procedure with the straight forward tutorial posted in google. But I had the problem of rendering the button in the page. So I followed the explicit load example in google +1 button in their website.  Below the steps I followed  to show up  google +1 in my sproutcore application:

1. Add the plusone script in the head portion of ‘index.rhtml’

<script type="text/javascript" src="https://apis.google.com/js/plusone.js">
    {"parsetags": "explicit"} /* for explicit loading */
</script>

2. Added <div id=”plusone-div”></div> where I wanted the button to appear.

3.  Added the following javascript function:

createPlusOne: function () {
    gapi.plusone.render("plusone-div",{"size":"medium","count":"true"});
}

first parameter: the div to render
second parameter: button configuration in json format
more configuration settings can be found in here.

4. Called this function in the states wherever I wanted to render the button.

That should be it. Enjoy +1!

Google very recently released its +1 button similar to the Facebook Like button. It’s part of the Google+ project which seems to take on Facebook and Skype at the same time with social networking and online audio/video chat feature.

To add google +1 button to your website you have to add the following scripts in your html.

<script type="text/javascript" src="https://apis.google.com/js/plusone.js"></script>

By default the included script will walk the DOM and render any +1 tags. The syntax is as follows:

 <g:plusone size="standard" count="true"></g:plusone>

That’s about it! If you want to know more in details you can visit the link: The Google +1

Sproutcore is an MVC architecture javscript framework for client-side for developing desktop like rich web applications. It enables building blazingly fast, innovative user experiences on the web. To know more about sproutcore visit here.

Install sproutcore in your windows machine you can download the windows installer from the site. Or you can install using ruby 1.9.2-p180.

gem install sproutcore -pre

if you are working on Windows then you will probably run into this when you install SproutCore:

gem install sproutcore -pre
Fetching: rack-1.2.2.gem (100%)
Fetching: json_pure-1.4.6.gem (100%)
Fetching: extlib-0.9.15.gem (100%)
Fetching: abstract-1.0.0.gem (100%)
Fetching: erubis-2.6.6.gem (100%)
Fetching: thor-0.14.6.gem (100%)
Fetching: eventmachine-0.12.10.gem (100%)
ERROR: Error installing sproutcore:
The ‘eventmachine’ native gem requires installed build tools.

Please update your PATH to include build tools or download the DevKit
from ‘http://rubyinstaller.org/downloads’ and follow the instructions
at ‘http://github.com/oneclick/rubyinstaller/wiki/Development-Kit’

You can find out more about DevKit at https://github.com/oneclick/rubyinstaller/wiki/Development-Kit and you can download DevKit at http://rubyinstaller.org/downloads, which you probably picked up on from the error message above.

Note: the latest version of “eventmachine” is not compatible with DevKit. You have to get the pre-release version by using this command:

gem install eventmachine –pre

Once you successfully install eventmachine run the following command again to install sproutcore.

gem install sproutcore -pre

When you try and install SproutCore again you should see a successful install like this:

gem install sproutcore -pre
Fetching: daemons-1.1.2.gem (100%)
Fetching: thin-1.2.11-x86-mingw32.gem (100%)
Fetching: sproutcore-1.4.5.gem (100%)
Successfully installed daemons-1.1.2
Successfully installed thin-1.2.11-x86-mingw32
Successfully installed sproutcore-1.4.5
3 gems installed
Installing ri documentation for daemons-1.1.2…
Installing ri documentation for thin-1.2.11-x86-mingw32…
Installing ri documentation for sproutcore-1.4.5…
Installing RDoc documentation for daemons-1.1.2…
Installing RDoc documentation for thin-1.2.11-x86-mingw32…
Installing RDoc documentation for sproutcore-1.4.5…

once you get this you should be able to create your first application running the following in command prompt:

sc-init

You should have a project folder created with the required files. Now you cd into the project folder and run the following command to start the server:

sc-server

Sproutcore browser by default listens to port 4020. Once you see the server has started to listening you can browse from browser to http://localhost:4020

That’s it you should see the welcome to sproutcore message in your browser after launching your project application!

%d bloggers like this: