Put some Agile into your community

Finding a way to stimulate/encourage your community to do stuff can be a very difficult task.  I will show you an Agile-like approach to do that and actually it works pretty well, but remember:

Don’t try to control your community, try to manage it.

Create the infrastructure

  • Get an account in Trello.
  • Define your basic iteration period. Let say 2 weeks.
  • Define tasks.

Don’t try to find people who want to contribute.

“What? Are you serious?”

Hell yeah. Try to create tasks first. Put anything you think can be doable in the next 2 weeks (This is your main task).

You can start from “we need someone to tweet using our account” , “we need a new wiki” or something more interesting like “we need someone to be responsible for beer giveaways”

Ready?

Invite

Ok, now invite ALL community members to create an account and to look at the task.

Let them:

  1. Vote for the tasks.  See how community see the importance of the tasks.
  2. Add themselves to a task. It’s a common mistake project manager/leader/the big boss to assign someone to a task. Don’t do that!

Teams

Now you can see which people are willing to work together on a certain task and you can create a new board for them.

Let say you have a task website on the main board:

And there are 10 people that want to contribute to it. Move them to another board and let them create tasks, with a simple workflow:

Todos > Working on > Done:

Meetings

If you have well working community or some kind of core contributors, you can start every iteration with a meeting and to define all the tasks together.

Why?

  • This approach will help you a lot to do things faster. Remember define only tasks that can be done in 2 weeks (or 3 weeks). It’s much easier to create a simple skeleton of your website with most, most important functionalities (like who we are and join us) than to plan and create whole website in 2 months.
  • Step by step
  • Build a community and respect your community member’s skills.
  • Invite anyone to join and to help. It’s kind of easy to find someone to write a post in a forum or to contact a media representative, because this takes 3-4 minutes.
  • Get things done!


Read More

Velocity Conference @Berlin.

Velocity Conference is an that is in my check list since …forever.
This year the event comes to Europe and unfortunately I will not be able to attend, because I have another event scheduled at the almost same time.

If you’re web person this event is a must attend event :)

Velocity Europe is the convergence of performance and site reliability experts and rock stars who share the unique experience that can only be gained by operating at scale. Velocity gives you two days of critical training, best practices, and case studies from the web ops and performance ecosystem, about how you can make your site scalable, reliable, and fast.

Discount
I’ve got 19.99% discount code and can share it with you if you write me to shopov.bogomil@gmail.com

Read More

WordCamp Prague 2012

I am planning to organize a conference focused, but not limited to blogging, hacking and freedom of speech and WordPress in Praha /Prague in February or March 2012.

If you are interested in helping, speaking nor sponsoring the event, please drop me a line via my contact page. The conference will be on English and Czech.


Mám v úmyslu uspořádat konferenci zaměřené mimo jiné na blogování, hacking a svobodu projevu a WordPress v Praze v únoru nebo březnu 2012.

Pokud máte zájem pomoci, mluvit ani sponzorování akce, prosím, napište mi linku přes kontaktní stránku . Konference bude v anglickém a českém jazyce.

What is a WordCamp?
/click on the image to see it big/
What is a Wordcamp

Read More

MongoDB, Node.js and admin auth

There is a big challenge to make MongoDB driver to work with Node.js, but here is an cool and working example to do that:

Require:

var mongodb = require("mongodb"); //require node-mongodb-native
var settings = require('./mconfig'); //for <a href="http://talkweb.eu/openweb/901">settings</a>

Connect to the admin database:

var mongoserver = new mongodb.Server(settings.mongo_host, settings.mongo_port, {});
admindb = new mongodb.Db('admin', mongoserver);

Try to auth with admin cretentials:

 
exports.adminlogin = function(callback) {
 
		admindb.open(function (error, client) {
 
			admindb.authenticate(settings.mongo_user, settings.mongo_pass, function (err, val) {
		        if (err) {
		             callback(0);
		        } else {
		            	callback(1);
 
		        }
   		 });
 
 	 });
 
 
};

It returns 1 on success and 0 on failure.

Read More

Full HTTPS REST server in Node.js

I will show you now, how to write a simple HTTPS JSON REST server using node.js components. Grab a beer, open your IDE and let’s start hacking.

0. Create certificates.

If you don’t have valid https certificates, you can generate one for testing purposes. If you need one cool certificate, you can join cacert community. Anyway, let’s openssl for a while:

openssl genrsa -out privatekey.pem 1024 
openssl req -new -key privatekey.pem -out certrequest.csr 
openssl x509 -req -in certrequest.csr -signkey privatekey.pem -out certificate.pem

1. Install additional modules.

We will need just one aditional module, called journey.

It’s working only in JSON mode, but anyway I don’t like XML REST at all. JSON is the future, baby.

npm install journey

2. Writing the router.js file.

- Define the modules required:

var journey = require('journey');
var https = require('https');
var fs = require('fs');

- Define the certificates part:

var privateKey = fs.readFileSync('../certs/privatekey.pem');
var certificate = fs.readFileSync('../certs/certificate.pem');
 
var options = {
  key: privateKey,
  cert: certificate
};

- Define the router that will handle all REST requests (GET, POST, PUT, DELETE):

var mrouter = new (journey.Router)();

- Define the map of all requests. In other words what to do when the router receive a request:

mrouter.map(function () {
// Default URL
this.root.bind(function (req, res) { res.send("Welcome to my application") });
 
//GET request on /databases
this.get('/databases').bind(function (req, res) {
do something
});
 
//GET request on a specific database - /database/users21
this.get(/^databases\/([A-Za-z0-9_]+)$/).bind(function (req, res, id) {
	 //id contains 'users21' part       
 });
 
/**PUT request example. 
* You can deal with as many parameters as you need, just write the regexp for it and assign a parameter. 
* Here is an example to update a document on a collection on MongoDB database. 
* We have 3 user parameters - 6 parameters in URL:
**/
this.put(/^databases\/([A-Za-z0-9_]+)\/collections+\/([A-Za-z0-9_]+)\/documents+\/([A-Za-z0-9_]+)$/).bind(function (req, res, dbid, collid, docid, data) {
	        res.send('update '+docid+ 'in '+collid + 'on: '+ dbid);
 });
}); //end mapping

3. And the last thing we should do is to turn on the HTTPS server and the router

https.createServer(options,function (request, response) {
    var body = "";
 
    request.addListener('data', function (chunk) { body += chunk });
    request.addListener('end', function () {
 
        mrouter.handle(request, body, function (result) {
 
            response.writeHead(result.status, result.headers);
            response.end(result.body);
        });
    });
}).listen(8081);

4. Run and connect your JSON client on httpS://127.0.0.1:8081 to test it.

node router.js

One file to rule them all

Here you can see the whole WORKING simple app including nice tricks like adding settings and whole bunch of regexp examples for handling the URL parameters.

Enjoy!

Read More

Capture API

I am looking forward Capture API to become part of Firefox soon. It’s really cool if I have the opportunity to capture my camera and my microphone.

function success(data) {
  var container = document.createElement("div");
  document.body.appendChild(container);
 
  for (var i in data) {
    var img = document.createElement("img");
    img.src = data[i].uri;
    container.appendChild(img);
  }
}
 
function error(err) {
  alert(err.message + " (" + err.code + ")"); 
}
 
navigator.device.captureImage(success, error, { maxNumberOfMediaFiles: 1 });

This is already implemented here and it’s really useful if you want to work on mobile devices:

// capture callback
var captureSuccess = function(mediaFiles) {
    var i, path, len;
    for (i = 0, len = mediaFiles.length; i < len; i += 1) {
        path = mediaFiles[i].fullPath;
        // do something interesting with the file
    }
};
 
// capture error callback
var captureError = function(error) {
    navigator.notification.alert('Error code: ' + error.code, null, 'Capture Error');
};
 
// start audio capture
navigator.device.capture.captureAudio(captureSuccess, captureError, {limit:2});

Read More

Subscribe to my RSS and win a free postcard (via snailmail)

Hello,
If you don’t know me, my name is Bogomil – Bogo for short. I am from Europe (Bulgaria).

I am an openweb hacker and a community enchanter (because I help people to create magic with their skills).

I am writing here about OpenWeb, FOSS Community management, hacking, Javascript, PHP and different interesting stuff and if you subscribe to my RSS feed (click here to do that) and if you send me your address (click here to send it to me via secure form) I promise I will send you a nice postcard using snail mail or I can buy you a beer if we meet somewhere.

Visit my blog

If you are coming from a planet or a link, please visit my blog to see what I am writing about.

Thanks,
Bogo

Read More

Create a class-based library in #JetPack (addon SDK)

I just commit to GitHub a class based library called JPersona..

You can get the background color and text color of the active persona your Firefox is wearing and to do whatever you want.

This example shows :
0. How to import LightweightThemeManager – the one responsible for handling Personas.
1. How to write class-based library for JetPack
2. How to import this library in your main.js and how to use it.

Go now to github and give me a feedback

Read More

JetPack: How to add a button to a webpage + events

This is a Jetpack example for beginners that shows:

0. How to add a simple DOM element – button to a webpage using Mozilla Addon SDK (Jetpack)
1. How to attach an event
2. And how to handle it.

If you want to try it – go here click on Test icon and when it loads, visit: http://talkweb.eu/labs/jetpack/button.html or use your own SDK

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
var buttonScript = [
'var butt = document.createElement("button");', //define button element
'var btext = document.createTextNode("Click me");', //define the text
'butt.appendChild(btext);', //attach text to the button
'butt.addEventListener("click", function(){document.bgColor="red"} , false)', //handle onclick event
'document.getElementById("test").appendChild(butt);' //put the button on the page
];
 
 
var pageButton = require("page-mod").PageMod({
include: 'http://talkweb.eu/labs/jetpack/button.html', // this script will works only on this website
contentScriptWhen: 'ready',
contentScript: buttonScript
});

Read More

Jetpack.ruble 0.2

My jetpack.ruble project has a new version. Hooray. The idea is to provide a rapid development tools for opensource IDE called Aptana, as a part of a bigger project to provide such tools for all Open Source tools we’re using.

Of course it’s still experimental, but as soon as I found some time I will create some nice features like snippets and preferences.

Here is the URL in GitHub – if you are interested, please watch it.

Help
Also I still need help. If you are JS hacker, please answer me this questions 3: http://talkweb.eu/openweb/768

Read More