Configurando proxy SOCKS 5 para Maven en Netbeans

Para configurar un proxy SOCKS 5 para Maven podemos hacerlo a través del archivo settings.xml, otra forma es agregar al «path» del sistema la variable MAVEN_OPTS.

En el caso particular de Netbeans 8.2, existe una forma fácil, para lo cual nos dirigimos al menu Herramientas > Opciones > Java > Maven (Activar si aún no lo está).

Ingresamos la dirección IP (o nombre del host) y el puerto del proxy en el campo Opciones de Ejecución Global:

Finalmente hacemos click en el botón «Aceptar».

Eso es todo, ahora Maven se conectará a Intenet a través del proxy SOCKS.

3 formas de uso de los Certificados Digitales

Un certificado digital es un archivo que asocia una clave criptográfica a uno o varios atributos de un usuario (persona o entidad), y son firmados por autoridades de certificación (AC).

Los componentes básicos de un certificado incluyen:

  • El nombre del usuario o entidad que está siendo certificado.
  • Una clave pública del usuario o entidad.
  • El nombre de la autoridad de certificación.
  • Una firma digital.

La especificación X.509 de la ITU (International Telecomunications Union) provee un estándar para la estructura de un certificado digital de clave pública.

En el Perú, por ejemplo, el RENIEC (Registro Nacional de Identificación y Estado Civil) actúa como AC, firmando las claves públicas de los ciudadanos y generando los certificados digitales correspondientes. Cualquier entidad que disponga de la clave pública del RENIEC estará en condiciones de verificar sus certificados digitales, otorgando la confianza correspondiente a las claves públicas asociadas a los mismos.

Las aplicaciones que usan este sistema incluyen el correo electrónico seguro, las comunicaciones seguras en la web, la firma digital de archivos de software, autenticación de smartcard y cifrado de archivos de sistema. Al final de este artículo conocerás las 3 principales formas de uso de certificados digitales.

1. Certificados SSL

Son utilizados para establecer una conexión cifrada entre un navegador (computadora del usuario) y un servidor (sitio web). Por ejemplo, protege la información de una tarjeta de crédito que es intercambiada durante cada visita (sesión).

Funcionan de la siguiente manera:

  1. El navegador solicita una página segura (https://).
  2. El servidor envía su clave pública con su certificado.
  3. El navegador verifica que el certificado fue firmado por un CA raíz, que aún sea válido y que esté relacionado al sitio web contactado.
  4. El navegador usa la clave pública para cifrar una clave simétrica aleatoria y la envía al servidor con la URL y los datos necesarios cifrados.
  5. El servidor descifra la clave simétrica usando su clave privada y la usa para descifrar la URL y los datos.
  6. El servidor retorna la página web solicitada y los datos cifrados con la clave simétrica.
  7. El navegador descifra los datos y la página web usando la clave simétrica, entonces muestra la información.

2. Certificados de firma digital

Una firma digital es equivalente a una firma manuscrita, identifica a la persona que firma un documento. A diferencia de una firma manuscrita, una firma digital es difícil de falsificar porque contiene información cifrada que es única al firmante y es fácil de verificar.

Una firma digital está compuesta de tres elementos:

  1. Un certificado digital única para cada firmante.
  2. Una clave privada, a la cual sólo el firmante puede acceder.
  3. Una clave pública, la cual permite a cualquier persona validar la firma.

Las firmas digitales son una aplicación de la criptografía de clave asimétrica (ver figura).

criptografia-asimetrica

3. Certificados de Autenticación Cliente

Imagina que visitas un sitio web e instantáneamente y automáticamente inicias sesión, sin llenar un usuario y una contraseña, sin hacer click en el botón de autologin del navegador, sin una cookie enviada del navegador al servidor.

Los certificados clientes son instalados en el navegador y transferidos al servidor cuando el servidor los solicita y el usuario está de acuerdo.

La  AC es responsable de otorgar un certificado cliente y relacionarlo con una clave privada. El certificado es enviado por sí mismo al servidor, mientras que la clave privada es usada para firmar la solicitud de autenticación. La firma es verificada en el servidor, entonces el servidor sabe que realmente eres tu a quien le pertenece el certificado.

En el Perú. por ejemplo, el programa social Beca 18 utiliza los certificados de autenticación del DNI electrónico de los becarios, para darles acceso a su intranet.

Conclusiones

Los certificados digitales son de gran ayuda para el desarrollo de las comunicaciones seguras en internet, lo cual involucra también al comercio electrónico. Los usuarios, administradores y desarrolladores de internet necesitan tener una sólida comprensión de estos sistemas de seguridad basados en certificados con el objetivo de aprovechar todo su potencial.

Los certificados digitales protegen internet asegurando la autenticidad de los mensajes enviados a través de la red.

¿Y tú ya utilizaste Certificados Digitales? Comparte tu experiencia en los comentarios.

Recibir mensajes de facebook mediante tu sitio web

Seguramente alguna vez te preguntaste como recibir mensajes en tu página del facebook mediante tu sitio web, algo así como un chat en línea.

Pues para esto la exitosa red social ha habilitado esta función mediante su renovado plugin para páginas web, en  donde no solamente podrás mostrar los likes y las actualizaciones de tu muro, sino ahora también un componente para enviar mensajes directamente a tu fan page y mantener la conversación mediante la aplicación del facebook messenger.

En este árticulo te enseñamos una forma de como agregar esta funcionalidad a tu sitio web.

Para empezar debes crear un botón o enlace, para ello debes ubicar el siguiente código HTML justo debajo de aperturar la tag body:

<a href="/mensajes-facebook.html" target="_blank" id="btn-msg-face">Envíanos un mensaje</a>

Seguidamente agregamos el estilo CSS:

#btn-msg-face{
  position: fixed;
  bottom: 0;
  height: 30px;
  right: 10px;
  min-width: 183px;
  z-index: 16000002;
  background: #1F93DF;
  color: #fff;
  font:bold 12px Verdana;
  line-height: 30px;
  overflow: hidden;
  text-align: center;
}

Con lo cual obtendremos lo siguiente:

boton-chat

Cada vez que el usuario haga click sobre el botón se abrirá una nueva ventana del navegador en donde se cargará el plugin de facebook, para lo cual anexaremos el siguiente código javacript con jquery:

$(document).ready(main);

function main(){
  $('#btn-msg-face').on('click', function(){
    PopupCenter(this.href, this.target, '350','450'); return false;
  });
}

function PopupCenter(url, title, w, h) {
    var dualScreenLeft = window.screenLeft != undefined ? window.screenLeft : screen.left;
    var dualScreenTop = window.screenTop != undefined ? window.screenTop : screen.top;

    width = window.innerWidth ? window.innerWidth : document.documentElement.clientWidth ? document.documentElement.clientWidth : screen.width;
    height = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : screen.height;

    var left = ((width / 2) - (w / 2)) + dualScreenLeft;
    var top = ((height / 2) - (h / 2)) + dualScreenTop;
    var newWindow = window.open(url, title, 'scrollbars=yes, width=' + w + ', height=' + h + ', top=' + top + ', left=' + left);

    if (window.focus) {
        newWindow.focus();
    }
}

Finalmente en el archivo «mensajes-facebook.html» colocaremos el código fuente que Page Plugin nos proporciona:

<!DOCTYPE html>
<html lang="es">
<head>
	<meta charset="UTF-8">
	<title>Envíanos un mensaje</title>
	<style>
		body{margin: 0;padding: 0}
	</style>
</head>
<body>
	<div id="fb-root"></div>
  <script>(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/es_LA/sdk.js#xfbml=1&version=v2.5&appId=xxxxxxxxxxxxxx";
  fjs.parentNode.insertBefore(js, fjs);
  }(document, 'script', 'facebook-jssdk'));</script>
<div class="fb-page" data-href="https://www.facebook.com/foo" data-tabs="messages" data-width="350" data-height="450" data-small-header="true" data-adapt-container-width="true" data-hide-cover="true" data-show-facepile="false">
<div class="fb-xfbml-parse-ignore">
<blockquote cite="https://www.facebook.com/foo">
Cargando chat...
</blockquote></div></div>
</body>
</html>

Con todo esto nuestros visitantes podrán interactuar con nuestras empresas mediante facebook :)

chat-facebook

Autocompilando Stylus

Stylus es un lenguaje innovador de hojas de estilo, el cual se compila a CSS. Inspirado en SASS, Stylus está construido con node.js y tiene la capacidad de ejecutarse en el navegador.

Para utilizar Stylus en Windows es necesario instalar node.js, el cual lo podemos descargar desde su sitio web nodejs.org.

Una vez instalado abrimos la línea de comandos (Windows + R > cmd) y ejecutamos lo siguiente:

npm –g install stylus

En esta oportunidad mostraremos una alternativa a la Automatización de Stylus con Sublime Text mediante una funcionalidad en línea.

Para esto simplemente accedemos a la línea de comandos y nos ubicamos en el directorio del proyecto, asumiendo que tenemos nuestros archivos de Stylus (.styl) en la carpeta styl y los archivos de hojas de estilo compilados (.css) en la carpeta css, ejecutamos lo siguiente:

stylus -w styl/ -o css/

Con esto estamos indicando a Stylus que monitorize (-w) los cambios que se realicen en la carpeta styl y compile automaticamente guardando el resultado (-o) en la carpeta css.

auto

Clase abstracta para el manejo de bases de datos MySQL en Java

Manejar bases de datos MySQL con los métodos nativos de Java puede ser harto complicado, en el presente artículo se describe cómo crear una clase abstracta de base de datos genérica, reutilizable, simple y muy fácil de utilizar.

Esta clase esta basada en el artículo “Creando una capa de abstracción con PHP y mysqli”.

Primeramente, nuestra clase abstracta deberá proveer de métodos públicos, que puedan ser llamados de forma estática, para crear un objeto conector, no sea necesario.

Propiedades

public class db {
  protected static Connection conn; // objeto conector
  protected static PreparedStatement stmt; // objeto sentencia preparada
  protected static String sql; // sentencia SQL a ser preparada
  public static ResultSet rs; // colección de resultados de la consulta
  protected static List<String> data; // lista de los tipos de datos
  public static List<Map<String, String>> results; // colección de datos para ser retornados
  public static String insertId; // último id insertado
}

La consulta SQL, deberá ser seteada en los modelos (clases) donde se requiera, incluyendo marcadores de parámetros (embebidos con el signo ?), en la posición donde un dato deba ser enlazado. Un ejemplo de ella, podría ser el siguiente:

String sql = "INSERT INTO productos (categoria, nombre, precio) VALUES (?, ?, ?)";

Mientras que la lista “data”, deberá contener los datos a ser enlazados (todos de tipo string):

List<String> data = Arrays.asList(categoria,nombre,precio);

Métodos

Conectar a la base de datos:

protected static void conectar() {
  db.conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
}

Preparar una sentencia SQL (con marcadores de parámetros):

protected static void preparar() throws SQLException {
  db.stmt = db.conn.prepareStatement(db.sql, Statement.RETURN_GENERATED_KEYS);
}

Enlazar los datos con la sentencia SQL preparada:

private static void setParams() throws SQLException {
  if (db.data != null) {
    int dataSize = db.data.size();
    for (int i = 0; i < dataSize; i++) {
      db.stmt.setString(i + 1, db.data.get(i));
    }
  }
}

Enlazar resultados de una consulta de selección:

private static void getData() throws SQLException {
  db.results.clear();
  db.rs = db.stmt.getResultSet();
  ResultSetMetaData metaData = rs.getMetaData();
  int columnCount = metaData.getColumnCount();
  while (db.rs.next()) {
    Map<String, String> columns = new LinkedHashMap<String, String>();
    for (int i = 1; i <= columnCount; i++) {
      columns.put(metaData.getColumnLabel(i), db.rs.getString(i));
    }
    db.results.add(columns);
  }
  db.rs.close();
}

Cerrar conexiones abiertas:

public static void finalizar() throws SQLException {
  db.stmt.close();
  db.conn.close();
}

Un método público que ejecute todas las acciones:

public static void ejecutar(String sql, List<String> data) throws SQLException {
  db.sql = sql;
  db.data = data;
  db.conectar();
  db.preparar();
  db.setParams();
  boolean rpta = db.stmt.execute();
  if (sql.toLowerCase().contains("INSERT".toLowerCase())) {
    ResultSet keys = db.stmt.getGeneratedKeys();
    keys.next();
    db.insertId = keys.getString(1);
  } else if (rpta) {
    db.getData();
  }
  db.finalizar();
}

La estructura de control de flujo condicional, que utiliza el método ejecutar(), es la encargada de discernir si se trata de una consulta de “lectura” a la base de datos para así, llamar al método getData, o si se trata de una consulta de “escritura” (INSERT, UPDATE ó DELETE). En ese caso, verifica si es una escritura de tipo “INSERT” para retornar la id del nuevo registro creado.

¿Cómo utilizar la clase creada?

En todos los casos, siempre será necesario invocar estáticamente al método ejecutar, pasándole al menos dos parámetros: la sentencia SQL a preparar y una lista con los datos a enlazar a la sentencia SQL preparada:

String sql = "INSERT INTO productos (categoria, nombre, precio) VALUES (?, ?, ?)";
List<String> data = Arrays.asList(categoria,nombre,precio);
db.ejecutar(sql, data);
this.idPaciente = db.insertId;

Consulta de selección:

String sql = "SELECT nombre, descripcion, precio FROM productos WHERE categoria = ?";
List<String> data = Array.asList(categoria);
db.ejecutar(sql, data);

Despliegue de Aplicaciones Web con Git

Comúnmente, a la hora de poner en producción una aplicación web, se utiliza FTP; sin embargo realizar cambios de esta forma se hace complicado debido a que se debe volver a subir cada archivo modificado y si necesitamos realizar un backup de la versión debemos hacer una copia manual.

Y entonces ¿por qué no utilizar Git?, con Git podemos desplegar nuestras aplicaciones de forma ágil y además llevar un control por versiones.

En este artículo se describe paso a paso cómo utilizar Git para el despliegue de aplicaciones web.

Para empezar se debe crear un repositorio central en un servicio en línea, para ello podemos usar GitHub o Bitbucket.

Seguidamente en nuestro proyecto debemos agregar el siguiente script: deploy.php, éste ejecutará los comandos necesarios para actualizar la aplicación desde el repositorio central hasta el servidor de producción.

En nuestro proyecto crearemos el repositorio local (En NetBeans: click derecho sobre el proyecto > Versioning > Inicialize Git Repository).

inicialize

Ejecutamos los comandos necesarios para subir el proyecto al repositorio central (En NetBeans: click derecho al proyecto > Git > Commit, y luego click derecho al proyecto > Git > Remote > Push).

figura-2

Hasta aquí ya tenemos la aplicación en el repositorio central.

Ahora viene la parte del despliegue para lo cual existe la posibilidad de hacerlo automáticamente cada vez que se actualice el repositorio:

En GitHub:

  1. Iniciar sesión y seleccionar el repositorio correspondiente.
  2. Ir a Settings > Service Hooks.
  3. Ingresar la URL de script de despliegue “deploy.php”.
  4. Click en “Update Settings”.

figura-3

En Bitbucket:

  1. Iniciar sesión y seleccionar el respositorio.
  2. Ir a configuración > Hooks.
  3. Seleccionar POST e ingresar la URL de “deploy.php”.
  4. Click en “Save”.

figura-4

Entonces clonamos el repositorio en el servidor de producción, ejecutando el siguiente comando:

git clone https://[username]:[password]@bitbucket.org/[username]/[repositorio].git [directory]

*Para GitHub solo reemplazamos el dominio.

Ahora ya debemos tener nuestra aplicación corriendo en el servidor.

Finalmente, para actualizar los cambios solo debemos actualizar (commit, pull, push) el proyecto y ejecutar deploy.php en el navegador (Ejemplo: http://server.com/deploy.php)

En el caso de Github no sera necesario ejecutar deploy.php, ya que cada vez que se realice una actualización del proyecto, el despliegue será automático.

Automatizando Jade y Stylus

Es momento de pasar el diseño de nuestro website a código fuente, a este paso se le llama maquetar y para lo cual normalmente se tiene que escribir infinidad de etiquetas HTML con los infaltables símbolos de menor (<) y mayor (>), de la misma forma para los estilos tenemos que escribir infinidad de puntos y comas (;) y llaves ({}).

Sin embargo existen alternativas para evitar el trabajo anterior, en este artículo hablamos de Jade y Stylus, el primero es un motor de plantillas que genera código HTML y el segundo un pre procesador de CSS, los cuales agilizan el trabajo de maquetación sin necesidad de escribir etiquetas, puntos y comas y llaves, más bien, es necesario llevar un código ordenado.

Realizaremos un ejemplo donde generaremos código HTML y CSS al mismo tiempo de guardar los archivos en Jade y/o Stylus. Para esto necesitamos tener instalado Jade, Stylus y el editor Sublime Text.

Primero debemos instalar nodejs, para ello lo instalamos desde nodejs.org

Luego instalamos stylus y jade desde la línea de comandos de windows:

npm –g install stylus
npm –g install jade

 

En Sublime Text debemos instalar los paquetes correspondientes para tener los código Jade y Stylus resaltados.

Para empezar debemos crear un nevo sistema de construcción para Jade de la siguiente forma:

figura-1

Se abrirá un archivo JSON modificamos el archivo como sigue:

{
  "cmd": ["cmd","/c","jade","-P","$file"],
  "selector": "source.jade"
}

Lo guardamos con el nombre «Jade.sublime-build» en la ubicación que se abre por defecto (C:\Users\[USERNAME]\AppData\Roaming\Sublime Text 2\Packages\User).

Para Stylus buscamos el archivo correspondiente (Stylus.sublime-build) en la carpeta de paquetes de Sublime Text y dentro de la carpeta Stylus. Lo editamos como sigue:

{
  "cmd": ["cmd","/c","stylus", "-c", "$file"],
  "file_regex" : ".",
  "selector": "source.stylus"
}

Hasta aquí podemos generar el código HTML y/o CSS presionando CTRL + B. Sin embargo si queremos generar el código al momento de guardar debemos instalar el paquete SublimeOnSaveBuild; una vez instalado lo configuramos seleccionando:

Preferences > Package Settings > SublimeOnSaveBuild > Settings > Default

Copiamos el código a:

Preferences > Package Settings > SublimeOnSaveBuild > Settings > User

Y agregamos las extensiones «styl» y «jade» a «filename_filter»,  asegurándonos de que «build_on_save» valga «1».

Con esto al momento de guardar archivos Jade y/o Stylus se generará automáticamente el código HTML y/o CSS correspondiente.

figura-2

figura-3

figura-4

figura-5

Al abrir el archivo «hola.html» obtendrémos el siguiente resultado:

figura-6

TipSS: Un Framework para CSS

Bueno y llego el momento de presentarles una iniciativa que llevaba un tiempo guardada, se trata de un Framework para CSS, la idea es que sea una alternativa simple ante otros frameworks.

Este framework te ayudará a pasar tus diseños web (en PSD u otro formato) a HTML/CSS, de forma sencilla, en esta primera versión cuenta con sencillos “tips” o clases predefinidas.

1.    Estructura
2.    Márgenes
3.    Alineación
4.    Esquinas redondeadas
5.    Iconos

A comparación de twitter bootstrap, tiene otra idea de estructura y se puede integrar con éste fácilmente.

Esta iniciativa se irá mejorando, la página es http://tipss.alain.pe/ y el código fuente lo puedes obtener de http://github.com/alainno/tipss.

Diseño de un formulario Login

En esta oportunidad te muestro un ejemplo de como diseñar un formulario login para un sistema Web.

La siguiente imagen primero se elaboró en Photoshop.

Seguidamente se codificó en HTML.

Mensaje...
Via Gamarra

Sistema de Gestión de Contenidos

Finalmente aplicamos estilos con algunas características de CSS3.

body{
	background:#464646;
	font-family:Arial, Helvetica, sans-serif;
	font-size:12px;
	margin: 0
}

#envoltura{
	position:absolute;
	left:50%;
	top:50%;
	margin-left:-165px;
	margin-top:-150px;
	width:330px
}

#mensaje{
	background: #ececec;
	border: 1px solid #000;
	border-radius:2px;
	box-shadow: 0 0 0 2px rgba(255,255,255,.1);
	display: none;
	font-weight: bold;
	height: 20px;
	line-height: 20px;
	left: 30px;
	position: absolute;
	right: 30px;
	text-align: center;
	top: -50px
}

#mensaje.mensaje-rojo{
	border-color: #e9322d;
	color: #e9322d
}

#mensaje.mensaje-verde{
	border-color: #46a546;
	color: #46a546
}

#contenedor{
	background-color:#356AA0;
	box-shadow: 0 0 0 5px rgba(255,255,255,.3);
	-webkit-border-radius:4px;
	-moz-border-radius:4px;
	border-radius:4px
}

#cabecera{
	border-bottom: 1px solid #666;
	color:#FFF;
	font-family:'Trebuchet MS', Helvetica, sans-serif;
	font-size:28px;
	height:50px;
	line-height:50px;
	text-shadow: 1px 1px 2px #000000;
	text-align:center
}

#cuerpo{
	background:#ececec;
	border:solid #ccc;
	border-width: 1px 0;
	padding:10px 30px
}

form,p{
	margin:0
}

p{
	padding-bottom: 5px
}

.mb10{
	margin-bottom: 10px
}

label{
	color: #666;
	font-weight: bold
}

input{
	border: 1px solid #999;
	border-radius:2px;box-shadow: 0 0 0 2px rgba(0,0,0,.1);
	font:bold 12px Arial, Helvetica, sans-serif;
	height: 24px;
	line-height: 24px;
	padding:0 2px
}

input#usuario{
	background:#fff url(../img/login-sprite.png) no-repeat 0 -23px;
	padding-left: 20px;
	width: 244px
}

input#contrasenia{
	background:#fff url(../img/login-sprite.png) no-repeat 0 -53px;
	padding-left: 20px;
	width: 244px
}

.boton{
	background: #ccc;
	background: -moz-linear-gradient(top,#eee,#ccc);
	background: -webkit-linear-gradient(top,#eee,#ccc);
	background: linear-gradient(top,#eee,#ccc);
	color: #666;
	padding:0 10px
}

.boton:active{
	position: relative;
	top: 1px
}

#pie{
	border-top: 1px solid #666;
	color: #fff;
	font-size: 11px;
	height: 24px;
	line-height: 24px;
	text-align: center
}

#nota{
	padding-top: 20px;
}

#nota a{
	background:url(../img/login-sprite.png) no-repeat;
	display: block;
	height: 18px;
	margin: 0 auto;
	opacity:.28;
	overflow: hidden;
	text-indent: 100%;
	-webkit-transition:opacity .3s linear;
	-moz-transition:opacity .3s linear;
	transition:opacity .3s linear;
	width: 125px
}

#nota a:hover{
	opacity:.5
}

Descargar fuentes | Demostración

Servidor Git con Gitolite y Netbeans

¿Te suena GitHub?, pues si no aun has escuchado dicha palabra, te cuento es una red social para programadores, y que es un servicio web para almacenar codigo fuente mediante Git. ¿Y qué es Git?, Git es un poderoso sistema de control de versiones diseñado por el creador de Linux, Linus Torvals.

En este artículo aprenderemos como crear nuestro propio “GitHub”, orientado a ser utilizado en un servidor dedicado dentro de una red local, mediante Gitolite. Gitolite es el software que nos permitirá administrar los repositorios y usuarios de Git.

Para empezar instalaremos Gitolite en una computadora con Ubuntu GNU/Linux, la cual será el servidor. Escribimos los siguientes comandos:

// generar llaves ssh y copiar

ssh-keygen -t rsa
cp ~/.ssh/id_rsa.pub /tmp/local.pub

// instalar git y gitolite

sudo apt-get install git gitolite git-daemon-run

// configurar

git config –global user.name «Your Name»
git config –global user.email your@email.com

// crear usuario

sudo adduser \
–system \
–shell /bin/bash \
–gecos ‘git version control’ \
–group \
–disabled-password \
–home /home/git \
git

// entrar a git

sudo su git
echo «PATH=$HOME/bin:$PATH» > ~/.bashrc
gl-setup /tmp/local.pub

// guardar el archivo que nos aparece y salir mediante vim (:wq)

// regresar al usuario por defecto

exit

// clonar git-admin

git clone git@ubuntu:gitolite-admin.git

// crear nuevo repositorio editando “gitolite-admin/conf/gitolite.conf” al cual podrá acceder cualquier usuario (@all)

repo     gitolite-admin
RW+  =  @all
repo     miproyecto
RW+  =  @all

// finalmente hacemos “commit”

git add .
git commit -a -m ‘crear nuevo repositorio’
git push origin master

Ya tenemos un servidor Git con Gitolite y Ubuntu.

En el siguiente paso inicializaremos el repositorio mediante Netbeans en una máquina con Windows, para lo cual debemos crear un usuario, para ello utilizaremos puttygen.exe.

Una vez en el programa, generamos una “llave publica” (1), copiamos el texto que aparece y lo guardamos en un archivo con la extension “.pub” (2), este archivo debemos copiarlo en el servidor dentro de “gitolite-admin/keys/” y hacer “commit”. Seguidamente guardamos la llave privada con OpenSSH, en un lugar aparente .

Abrimos Netbeans, nos ubicamos en el proyecto, seleccionamos click-derecho > Versioning > Inicialize Git Repository y seleccionamos la carpeta donde se creara el repositorio.

Ahora hacemos “commit” (click-derecho > Git > Commit) y luego “push” (click-derecho > Git >Remote > Push), para lo cual rellenamos con los datos que aparecen en la figura siguiente:

Seleccionamos siguiente y finalizar; listo el repositorio esta inicializado.

Para agregar otro usuario de otra máquina repetimos los mismos pasos con puttygen y luego clonamos el proyecto (Team > Clonar…), y utilizamos los mismo datos de la figura anterior pero esta vez con la llave privada correspondiente.

Las opciones básicas de Git son “commit”, “pull” y “push”, y que desde Netbeans las ubicamos al hacer click-derecho en el proyecto o en el menu “Team”.

Pull: Recuperar la última versión del proyecto.

Commit: Actualizar versión local.

Push: Enviar nueva versión al servidor.

Como conclusión podemos decir que es muy necesario utilizar un sistema de control de versiones cuando se programa de forma colaborativa, ya que tiene muchas ventajas, por lo que vale la pena aprender Gitolite o en todo caso GitHub.