viernes, 2 de marzo de 2012
Mudanza
De ahora en más el blog pasará a estar en www.asincronico.com usando wordpress para tener más posibilidades de customizar el mismo.
Saludos!.
miércoles, 18 de enero de 2012
Sincronización con RSync
Los casos de uso son variados según la necesidad, por ejemplo, tenemos una copia local de archivos fuente de un proyecto web, deseamos publicar las modificaciones en el servidor de producción. Este sería el más común (por lo menos en mi caso) de los escenarios.
La carpeta src dentro del server A (o pc de trabajo) puede tener archivos que no se necesiten subir, o carpetas que no debe porque matchear contra la que está en el servidor B, todo esto lo resuelve el rsync según la configuración utilizada.
Como dije antes, es un comando de Unix, es por esto que tenemos la ventaja de usar "la bash" para generar un script
Especificación del comando
rsync {opciones} {conexión} {origen} {destino}
Opciones
- -v, --verbose Extender info
- -q, --quiet Suprimir información que no sean errores
- -c, --checksum utilizar solo el checksum para evaluar la comparación de archivos
- -a, --archive archive mode; equals -rlptgoD (no -H,-A,-X)
- -r, --recursive recursivo dentro de directorios
- -b, --backup realizar un backup (ver --suffix & --backup-dir)
- --backup-dir=DIR realizar backup dentro de DIR
- --suffix=SUFFIX backup suffix (default ~ w/o --backup-dir)
- -p, --perms preservar permissions
- -E, --executability preservar executability
- -o, --owner preservar owner (super-user only)
- -g, --group preservar group
- -t, --times preservar modification times
- -n, --dry-run Realizar una corrida en seco, excelente para poder probar si lo que hacemos es lo que necesitamos.
- -z, --compress comprimir durante la transferencia
- --compress-level=NUM compression level
- -f, --filter=RULE Necesario al momento de realizar exclusiones (por ejemplo, carpetas .svn, archivos .project, etc)
- --exclude=PATTERN matching PATTERN
- --exclude-from=FILE Desde un archivo "FILE"
- --include=PATTERN inverso al exclude
- --include-from=FILE inverso exclude-from
- --files-from=FILE inverso files-from
- -h, --human-readable En formato legible por humanos
- --progress Mostrar el progreso (esto genera mucha suciedad al momento de ver el log)
- -4, --ipv4 preferir uso de IPv4
- -6, --ipv6 preferir uso de IPv6
- --delete borrar archivos del destino que no macheen
viernes, 6 de enero de 2012
1 - Control de Versiones GIT
Estos son los comandos utilizados en esta sección
- git config
- git clone
- git status
- git add
- git commit
- git rm
- git mv
- git log
- Committed: La información del archivo esta almacenada en forma segura en la database local.
- Modified: El archivo sufrió cambios locales pero no fue "comiteado" hasta el momento.
- Staged: Se ha marcado el archivo como modificado y pronto para el commit de la próxima snapshoot.
- /etc/gitconfig: Contiene los valores de todos los usuarios y todos los repositorios; para acceder a este recurso se hace git config --system (lectura y escritura)
- ~/.gitconfig file: Contiene la información del usuario local; se accede con git config --global.
- .git/config: especifica la información particular de ese repositorio.
Configurar quien soy yo
Lo primero que debemos hacer una vez instalado GIT (sudo apt-get install git) es setear quien somos; esto lo hacemos con el comando git config --global para no tener que hacerlo nuevamente (notar el --global):
git config --global user.name "Juan Perez"
git config --global user.email "juan.perez@email.com"
Configuración de herramientas
Lo básico, el editor y el diff tool.
git config --global core.editor vim
git config --global merge.tool vimdiff
Una (extensa) lista de opciones se puede encontrar haciendo git config --help; un resumen del seteo de opciones se puede encontrar haciendo git config --list o en su defecto si solo se quiere cierta propiedad, se hace git config user.name
Hacer un
Para eso tan solo necesitamos tener la url del repo y hacer un git clone
git clone git://github.com/schacon/grit.git
Imagen extraída de: http://progit.org/book/ch2-2.html |
- git log --graph - muestra el log como un grafo
- git log --reverse - invierte la salida del log
- git log -4 - limita la salida a n logs
- git log --since={--since, --after, --until, --before} {2.weeks, "2008-10-10", etc}
- git log --author=User - Que el autor coincida con User.
- git log --committer=User - Que el committer coincida con User.
- git log --help
- git log -p - muestra el diff de cada commit
- git log --stat - muestra la lista de archivos modificados en cada commit
- git log --pretty=OPCION - muestra el output de según la forma predefinida
Opciones - oneline - muestra cada commit (comentario del) en una sola línea
- short - la salida pero resumida
- full
- fuller
- format: "%h - %an, %ar : %s"
Etiquetas de formateo
- %H - Commit hash
- %h - Abbreviated commit hash
- %T - Tree hash
- %t - Abbreviated tree hash
- %P - Parent hashes
- %p - Abbreviated parent hashes
- %an - Author name
- %ae - Author e-mail
- %ad - Author date (format respects the –date= option)
- %ar - Author date, relative
- %cn - Committer name
- %ce - Committer email
- %cd - Committer date
- %cr - Committer date, relative
- %s - Subject
viernes, 26 de noviembre de 2010
Experiencias en Code Igniter - Parte 1
0. Nota
Esto esta enfocado a personas que por lo menos han trabajado con algún framework, no esta escrito para personas que recién arrancan en el mundo de éstos.
1. Instalación
Vamos al sitio oficial de CodeIgniter (http://codeigniter.com/) y descargamos la última versión (al día de hoy 1.7.2) .
Descomprimimos el archivo y vemos que la estructura es:
/
. /system
. /index.php
Primero que nada, el index.php es el archivo de CodeIgniter (de aquí en más CI) que maneja todas las peticiones al framework. Dentro de la carpeta system tenemos un monton de carpetas, la única que debemos tener en cuenta es la carpeta "application".
Dentro de esta carpeta estarán todos los archivos específicos de nuestro proyecto. Por lo que actualizar el framework se torna sumamente sencillo.
Hemos de suponer que se tiene de un lugar donde alojar estos archivos, por ejemplo, un servidor con un dominio. En otro momento mostraré como se pueden crear un entorno de trabajo cómodo para trabajar varias personas sobre el mismo proyecto. Entonces, decía, supongamos que tenemos un dominio http://misitio.com/ y que el document root de nuestro hosting se llama "httpdocs".
Debemos tirar dentro de la carpeta pública (httpdocs) los archivos ta cual están en el .zip que nos bajamos del sitio de CI.
Para una instalación básica, solo debemos modificar el archivo:
/system/application/config/config.php
Donde dice:
$config['base_url'] = "http://www.mysite.com/";
debemos especificar la dirección del sitio, ahora bien, muy a menudo sucede que el sitio puede cambiar de dirección (múltiples nombres o diferentes ámbitos), lo que yo aconsejo es dejar parametrizado este parámetro (redundancia :D )
$config['base_url'] = "http://".$_SERVER['HTTP_HOST']."/";
Así nos aseguramos de que no importa el dominio en el que se encuentre, siempre va a funcionar.
1. División MVC
La división MVC clásica nos dice que tenemos una capa Modelo, una capa Vista y una capa Controladora (en realidad sería Model View Controller). Esto es ya lo disponemos en nuestro CI.
- /controller: carpeta de los controladores.
- /model: carpeta de los modelos.
- /views: carpeta de los archivos de vistas.
- Lo bueno: Hay una separación entre la vista y el modelo mediando por el controlador, este se encargará de trabajar los datos entre ambos extremos para poder presentarlos en cada uno de ellos de la manera correcta.
- Lo malo: se torna complicado reutilizar código o modularizar componentes ya que depende mucho de como fue confeccionado el controlador. Es decir, puedo reutilizar un controlador que permita registrar o loguear a un usuario, pero ya es más difícil si mi controlador hiciera cosas más complejas o que dependan un poco más del proyecto en el que esté.
Ahora, ¿que pasa si a este modelo le agregáramos una capa más al MVC? llamémosla capa "business". Podríamos colocar aquí todo lo relativo al manejo grueso del negocio en la aplicación, haciendo que una clase sea la encargada exclusiva de solicitar datos al modelo y presentarlos como colección de objetos al controlador, para que éste opere con éstos como lo desee. También se encargaría de las acciones que impacten en el modelo, tomando los datos en "crudo" desde el controlador para que luego trabaje con ellos (validación, conversión, etc) y eventualmente realize la operación solicitada o notifique un error. También puede encargarse de tareas sobre archivos, enviar e-mails, etc. Todo aquello que pueda ser modularizado y realice tareas complejas (más allá de tareas de presentación de datos).
Resumiendo: Creamos una nueva capa llamada business donde concentra todo el negocio grueso de nuestra aplicación, impacto de datos en el modelo, validación de los datos, obtención de datos desde el modelo, envío de e-mails, etc, etc.
2. Transferencia de datos y Objetos
Como habrán visto, la transferencia de datos, sobre todo de parámetros en php puede llegar a ser compleja si no se tiene cuidado. Es por eso que el concepto que debemos asimilar es la de usar Data Transfer Objects (DTOs). Estos son objetos sencillos donde representarían la entidad que deseamos modelar. Estos objetos no son nada mas que clases vacías de implementación solo con los atributos.
/**
*
* User Data Transfer Object
* @author isanchez
* @version 1.0
*
*/
class UserDTO {
/**
*
* User Identification
* @var Int
*/
public $userId = null;
/**
*
* User name
* @var VARCHAR
*/
public $name = null;
/**
*
* User E-mail
* @var VARCHAR
*/
public $email = null;
}
$userDTO = new UserDTO();
$userDTO->userId = 123;
$userDTO->name = "Bill Gates";
$userDTO->email = "none@none.com";
Entonces cuando queremos pasarle los datos de creación de un usuario al business de usuario, solo deberíamos cargar los datos como lo hicimos anteriormente (sin el userId obviamente) y pasárselos a la función encargada, como por ejemplo:
$userDTO->userId = $userBusiness->create($userDTO);
if( $userDTO->userId > 0 ){
echo "Usuario creado";
}else{
echo "No se pudo crear el usuario";
}
Resumiendo: Usamos clases vacías como objetos para trasportar datos, tanto sea para pasarlo como parámetro entre los métodos de una clase como para usarlos a nivel de vista (podemos paras arrays de UserDTOs cuando queramos listar los usuarios de nuestra aplicación por ejemplo).Bien hasta aquí mas o menos se logra tener instalada una copia de CI con la división MVC + la capa business. Más adelante escribiré en detalle sobre esta última capa y sobre las clases "base" que debemos tener para una mejor utilización de éste framework.
Acerca del mundo blogger
Antes que nada esto es simplemente una reflexión que carece de toda funcionalidad práctica.
Resulta que siguiendo recomendaciones de amigos sobre los beneficios de escribir blogs había comenzado este ya hace no se cuanto tiempo.
Uno de estos amigos me dijo que el lo veía mas bien como un instrumento para escribir "conocimiento adquirido" y que de esa manera, ejercitaba un poco más su dominio en el tema y que de última, le servía para mantener una especie de "manual" online de lo que ya sabía.
Es por eso, que hay algunos post míos sobre algoritmos y cosas del svn y bla bla bla....
Pero el mundo del trabajo es voraz y me ha alejado de este pequeño espacio.
Ahora bien, ¿a que viene este post? resulta que, como le había agregado analytics, estaba viendo que sin hacer prácticamente nada, sin agregar un post ni de casualidad durante años, este bendito sitio viene a tener más entradas que algunos otros que tengo jajajja es increíble como con 4 post "Bobos" se puede llegar a tantas entadas. :D
Bueno era eso solo, una simple micro reflexión, comentario, catarsis que quería hacer.
Muchas gracias a los 4 individuos que dejaron comentarios en los posts anteriores :D
miércoles, 22 de abril de 2009
Festival Latinoamericano de Instalación de Software Libre Flisol 2009 Montevideo - Uruguay
Desde la web del sitio, ¿que es el Flisol?
Es el Festival Latinoamericano de Instalación de Software Libre (FLISoL) es el evento de difusión de Software Libre más grande en Latinoamérica. Se realiza desde el año 2005 y su principal objetivo es promover el uso del software libre, dando a conocer al público en general su filosofía, alcances, avances y desarrollo.
Para tal fin, las diversas comunidades locales de software libre (en cada país, en cada ciudad/localidad), organizan simultáneamente eventos en los que se instala, de manera gratuita y totalmente legal, software libre en las computadoras que llevan los asistentes. Además, en forma paralela, se ofrecen charlas, ponencias y talleres, sobre temáticas locales, nacionales y latinoamericanas en torno al Software Libre, en toda su gama de expresiones: artística, académica, empresarial y social.
Anfiteatro Antel
9:00 | Apertura | Agradimientos, mención de sponsor etc. |
9:30-10:15 | Enrique Verdes | Software Libre: guía de supervivencia. |
10:30-11:15 | Andrea Mangiatordi | Tecnologías de accesibilidad. |
11:30-12:15 | Mauricio Campiglia | Filtrado de contenidos para padres. |
12:30-13:15 | Macello Farias | Amenazas en Internet. |
13:15-14:00 | Receso: Comida,música, etc. | |
14:00-14:45 | Nicolás Levy | Taller Básico de Ubuntu |
15:00-15:45 | Nicolás Levy | Taller Básico de Ubuntu |
16:00-16:45 | Marcelo Ramos | El lenguaje de programación Python |
17:00-17:45 | Nestor Flaquer y Graciela | Uso básico de la Xo. |
18:00-18:30 | Nestor Flaquer y Graciela | Uso básico de la Xo. |
18:30 | Fernando Da Rosa | Software Libre y apropiación tecnológica. |
Sala Interactiva
9:30-10:15 | ||
10:30-11:15 | Alejandro Segovia | Ceibal Chess |
11:30-12:15 | Ceibal Jam | Programación |
12:30-13:15 | Ceibal Jam | Programación |
13:15-14:00 | Receso: Comida,música, etc. | |
14:00-14:45 | Virginia Demarco | Taller de Gimp |
15:00-15:45 | Nicolás Pence | *BSD Sistemas Operativos Libres Alternativos. |
16:00-16:45 | Carlos Moreira, Mitchel Quilici y Carlos Pirez | Promoviendo la independencia tecnológica |
17:00-17:45 | Ismael Castagnet Gabriela Rodríguez | Taller: "Democratización del conocimiento en la era de la información (oportunidades, amenazas y desafíos)" |
18:00-18:30 | Ismael Castagnet Gabriela Rodríguez | Taller: "Democratización del conocimiento en la era de la información (oportunidades, amenazas y desafíos)" |
19:00 | Cierre del Festival | Sorteos y mas ... |
Instalación y Configuración de Apache 2.2 con PHP y MySQl
El otro día me vi en la situación de instalar Apache con PHP y MySQL en mi ubuntu 8.10 (próximamente a convertirse en el 9.1) y googleando encontré mucho material, y arme un instructivo paso a paso de como instalar Apache en Ubuntu.
Ejecutamos para instalar apache.
sudo apt-get install apache2
Ejecutamos para instalar php5:
sudo apt-get install php5 libapache2-mod-php5
Para comprobar que este bien instalado hacemos:
sudo a2enmod php5
Reiniciamos apache:
sudo apache2ctl restart
Instalamos MySQL:
sudo apt-get install mysql-server
Instalamos manejador de php mysql:
sudo apt-get install php5-mysql
Y como complemento si queremos SVN:
sudo apt-get install subversion
Ahora bien, vamos a necesitar identificar y hacer algunos ajustes al apache para que funcione con algunos elementos extras como por ejemplo, los Virtual Host (VHost en adelante).
La idea es crear sitios con virtual host distintos para que cada uno tenga una configuración aparte.
Para esta tarea primero identificaremos la estructura de directorios de apache.
En /etc/apache2 disponemos de varios subdirectorios dos de ellos importantes para nosotros.
•conf.d
•mods-available
•mods-enabled
•sites-available
•sites-enabled
Los ficheros de configuración de los VHost se configuran en sites-available.
En sites-enabled sólo contiene enlaces a aquellos VHost que queremos activar.
Supongamos que queremos crear (por ejemplo) un VHost de nombre "misitio.site" para que, cuando ponga en mi navegador http://misitio.site me lleve a la página principal de ese host.
Observar!! Si pongo http://localhost me llevará al VHost por defecto (distinto del de misitio.site).
Pero antes que nada, para que mi browser "sepa" a que ip conectarse cuando haga el request de misitio.site debo añadir unas líneas al archivo situado en: /etc/hosts
Entonces ejecuto
sudo vim /etc/hosts
Creo una nueva entrada manteniendo lo que había y añado lo siguiente:
127.0.0.1 misitio.site
127.0.0.1 www.misitio.site
En general será {IP} {serverName} à IP y nombre del servidor
Observar que esto solo es necesario para que desde mi propia máquina pueda acceder al sitio por medio del browser, en caso de montar un servidor, este trabajo lo haría el propio dominio que estaría apuntando a la ip de mi servidor.
Ahora comienzo con la creación del espacio en disco para mi sitio, creo una carpeta para el contenido dentro de la carpeta /var/www/ para este caso usaremos: /var/www/misitio.site
Notar que no interesa que como se llame la carpeta, pero es una buena práctica identificarla con el dominio que tendrá.
Pasamos a la configuración del VHost, ejecutamos
cd /etc/apache2/sites-available
Hacemos:
sudo vim default
default es un archivo donde se definen los virtual host y le agrego la línea (esto solo por una única vez) NameVirtualHost *:80
Hago una copia del archivo default ejecutando
cp default misitio.site
Edito el misitio.site y lo dejo, como por ejemplo:
ServerAdmin admin@misitio.site
DocumentRoot "/var/www/misitio.site/src"
ServerName misitio.site
ServerAlias www.misitio.site
</VirtualHost>
En fin, agrego todo lo que necesite para mi VHost, como por ejemplo reglas de rescritura, etc.
Cierro el archivo y ejecuto
cd /etc/apache2
y luego
a2ensite misitio.site
El comando a2ensite (available 2 enablesite) crea un enlace en sites-enable al site que le indiquemos (es decir, activa el VHost que acabamos de crear)
Comprobamos que todo este OK ls -al sites-enabled/
Recargamos apache /etc/init.d/apache2 reload
En caso de que el VHost configurado lleve reglas de rescritura, se debe cargar el módulo mod_rewrite esto lo podemos hacer con el comando a2enmod ejecutado:
cd /etc/apache2/
y luego
a2enmod rewrite
y por último restart del apache
/etc/init.d/apache2 restart
Y con esto tendríamos pronto un sitio en apache, mediante un virtual host, podremos chequearlo con solo acceder a http://misitio.site