Monthly Archives: July 2009

"Quince errores a evitar con sus empleados e impedir la desmotivación y las renuncias"

Leyendo Portafolio.com.co encontré un artículo que me pareció muy interesante, mas aún en esta época de crisis en múltiples aspectos.  Se trata de los "Quince errores a evitar con sus empleados e impedir la desmotivación y las renuncias" los cuales enuncio a continuación.

  1. Son afortunados por tener un trabajo.
  2. Ellos saben qué piensa la empresa.
  3. No se pueden ignorar los rumores.
  4. Falta de reconocimiento.
  5. Dejar los elogios para el final.
  6. No apoyar a los empleados.
  7. Reducir el gasto en formación.
  8. No tratar bien a los talentosos.
  9. Entre ocupado y productivo.
  10. Complicar el desarrollo del trabajo.
  11. Esperar tiempos mejores.
  12. Nunca sacrificar la calidad.
  13. Recortes equivocados.
  14. Descuidar al cliente.
  15. Cortar las alas.

Enlaces.

Modelos de formularios con Yii (validación)

Introducción.

Después de poblado el modelo con la información proporcionada por el usuario a través del formulario, la validación verifica que la información del modelo sea correcta mediante la aplicación de un conjunto de reglas definidas específicamente para cada modelo.

Especificación de reglas.

  • Para especificar las reglas de validación de un modelo es necesario sobreescribir el método rules().
    public function rules()
    {
        return array(
            array('value1, value2, operator', 'required'),
            array('value1, value2', 'numerical')
        );
    }
  • El método rules() retorna un arreglo cuyos elementos corresponden con la siguiente especificación.
    array('<lista de atributos>', '<validador>', 'on' => '<lista de escenarios>', ... <opciones adicionales>)
    • El listado de atributos corresponde con los nombres separados por comas de los atributos a los cuales se les aplica la regla de valildación.
    • El nombre del validador determina el tipo de verificación que se debe realizar sobre los atributos.
    • El parámetro on (opcional) permite especificar en cuales escenarios (lista separada por comas) aplica la regla.
    • Las opciones adicionales son parejas nombre/valor que permiten asignar valores iniciales a las propiedades del validador.

Tipos de validadores.

Existen tres tipos de formas como es posible especificar las reglas de validación.

  1. Como un método del modelo.
  • La firma del método deberá corresponder con la siguiente.
    /**
     * @param string El nombre del atributo que será validado.
     * @param array Opciones adicionales especificadas en la regla de validación.
     */
    public function NombreValidador($atributo, $parametros)
  1. Como una clase que hereda de CValidator.
  2. Como un alias de un validador predefinido.

Validadores predefinidos.

Corresponden a alias mas cortos y sencillos de los validadores mas utilizados sobre los atributos.

AliasClaseDescripción
captchaCCaptchaValidatorDebe ser igual al código de verificación mostrado en el CAPTCHA.
compareCCompareValidatorEs igual a otro o a una constante.
emailCEmailValidatorEs una dirección de correo electrónico válida.
defaultCDefaultValueValidatorAsigna un valor por defecto.
existCExistsValidatorExiste en una columna específica de la tabla.
fileCFileValidatorContiene el nombre de un archivo subido al servidor.
filterCFilterValidatorTransforma al atributo con el filtro.
inCRangeValidatorPertenece a una lista predefinida de valores.
lengthCStringValidatorSu longitud se encuentra dentro de cierto rango específico.
matchCRegularExpressionValidatorCoincide con la expresión regular especificada.
numericalCNumberValidatorEs un valor numérico.
requiredCRequiredValidatorNo permite valores vacíos.
typeCTypeValidatorVerifica que sea del tipo especificado.
uniqueCUniqueValidatorEs único en la columna de la tabla en la base de datos.
urlCUrlValidatorEs una URL válida.

A continuación se muestras algunos ejemplos de estos validadores.

/* Se requiere un valor Username, no puede dejarse vacío */
array('username', 'required'),
/* Username deberá tener entre 3 y 12 carácteres */
array('username', 'length', 'min' => 3, 'max' => 12),
/* En el escenario 'registro', password deberá coincidir con password2 */
array('password', 'compare', 'compareAttribute' => 'password2', 'on' => 'registro'),
/* En el escenario 'login', password deberá ser autenticado (validador de método [1] o de clase [2]) */
array('password', 'authenticate', 'on' => 'login')

Ejecución de la validación.

  • Es posible forzar a la validación manualmente mediante el llamado al método CModel::validate().  El llamado a métodos como CActiveRecord::save() lanzan automáticamente la validación.
  • El retorno del método CModel::validate() se utiliza para verificar si la validación fue exitosa o si falló alguna de las reglas.
  • Es posible (opcional) definir un escenario para la ejecución de la validación.  En caso de especificarse se tomarán en cuenta las reglas que NO tienen definido un escenario (parámetro on) y aquellas cuyo escenario coincida con el definido para la ejecución de la validación.  En caso de no especificarse un escenario, se tomarán en cuenta únicamente las primeras reglas, las que NO tienen definido un escenario.
$modelo -> scenario = 'registro';
if($modelo -> validate())
{
    // Éxito en la validación
}
else
{
    // Fracaso en la validación
}
  • Es posible obtener mayor información del validador mediante los siguientes métodos que pueden ser aplicados globalmente para todos los atributos o a uno en específico.
    • CModel::hasErrors().  Verifica si hubo o no errores en la validación.
    • CModel::getErrors().  Obtiene los mensajes de error generados durante la validación.

Enlaces.

Modelos de formularios con Yii (definición y asignación de atributos)

Introducción.

En Yii existen dos tipos de modelos: los basados en información que proviene de un formulario (form model) la cual se va obtener, manipular y desechar, y la proveniente de una base de datos (active record model) la cual provee las operaciones de CRUD sobre los datos.  En este artículo estaré haciendo referencia al primero de los modelos, el relacionado con la manipulación de información proveniente del usuario a través de un formulario.

El procedimiento típico para el desarrollo de las aplicaciones basadas en formularios es el siguiente.

  1. Crear un modelo que represente en sus campos a los datos que van a ser manipulados.
  2. Crear un controlador con sus respectivas acciones que respondan a los requerimientos del usuario.
  3. Crear una vista con el/los formulario/s asociados a las acciones.

Las acciones generales que es posible definir en un modelo basado en formularios son siguientes.

  • Definición.
  • Asignación de atributos (datos).
  • Validación.
  • Implementación de la acción.
  • Creación del formulario.

Definición.

  • Los modelos basados en formularios heredan de CFormModel.
  • Sus atributos definen los datos que van a ser almacenados del formulario.
  • Si se especifican valores por defecto para los atributos su estado se reflejará en las vistas correspondientes a los formularios.
class CalculatorForm extends CFormModel
{
    public $value1;
    public $value2;
    public $operator = '+';    // Default value.
}

Asignación de datos.

Es posible especificar valores para los atributos del modelo de dos maneras.

  1. Asignación individual.
  2. Asignación general.

Asignación individual.

  • Hace referencia al acceso directo de los atributos.
  • Se debe utilizar cuando es necesario realizar algún tipo de verificación o cálculo de la información proveniente del formulario.
$model = new CalculatorForm();
$model -> operator = '*';

Asignación general.

  • Asigna todos los atributos del modelo cuyos nombres coincidan con la información proporcionada, habitualmente en $_POST.
  • Se incluye un escenario que permite diferenciar cuales atributos si se deberán modificar durante la asignación general.
$model = new CalculatorForm();
$model -> scenario = 'calculate';
if(isset($_POST['CalcForm']))
    $model -> attributes = $_POST['CalcForm'];
  • Es posible filtrar/asegurar cuales son los valores seguros para asignar masivamente por cada uno de los escenarios posibles.
  • Para hacer esto es necesario sobreescribir el método safeAttributes() del modelo.
public function safeAttributes()
{
    return array(
        parent::safeAttributes(),
        /* Atributos que pueden ser asignados en todos los scenarios */
        'atrib1, atrib2, ...',
        /* Atributos que sólo pueden ser asignados en el escenario X */
        'escenarioX' => 'atribA, atribB, ...'
    );
}
  • Si ninguno de los atributos del modelo será dependiente de un escenario es posible simplificar el retorno de safeAttributes() en una cadena conteniendo el listado de los nombres de los atributos seguros para asignación general.
public function safeAttributes()
{
    /* Asignación general sin dependencia de escenarios */
    return 'atrib1, atrib2, ...';
}

Enlaces.

Instalación de los diccionarios de corrección ortográfica para OpenOffice 3.x

Introducción.

Como actualización al procedimiento realizado hace un par de años de instalación de los diccionarios de corrección ortográfica en OpenOffice 2.x, ahora documentamos la instalación de dicionarios en la nueva versión, OpenOffice 3.x.

Este proceso es ahora mucho mas sencillo ya que no se realiza a través de un asistente (wizard) como se hacía anteriormente sino que ahora se hace a través de las extensiones de diccionario.

Procedimiento.

  1. Acceda al sitio web de las extensiones de diccionario.http://extensions.services.openoffice.org/dictionary
  2. Seleccione el idioma de su preferencia, por ejemplo Spanish/Español y haga clic sobre el enlace correspondiente.
  3. Haga clic sobre el enlace cuya etiqueta es Get It!.
  4. Cuando el navegador le pregunte si abrir o guardar el archivo (diccionario-es-*.oxt) elija abrirlo con la aplicación de OpenOffice.org (default).
  5. Cuando el Administrador de Extensiones de OpenOffice le pregunte si esta seguro que desea realizar la instalación del diccionario presione el botón de OK y posteriormente cierre el diálogo.
  6. A partir de este momento ya podrá utilizar el idioma en sus documentos modificándolo a través del siguiente menú.Herramientas > Opciones > Configuración del idioma > Idiomas > Idioma por defecto para los documentos.
    Tools > Options > Language Settings > Languages > Default languages for documents.

Enlaces.

Introducción a PHPTemplate con Drupal 6

Introducción.

PHPTemplate es un motor (engine) de temas desarrollado a la par de Drupal que permite la utilización de código PHP en ellas facilitando la separación entre lo concerniente al programador y lo relacionado con el diseñador web.  En la versión 6 se ubica su núcleo en themes/engines/phptemplate pero además se incluyen a otros archivos en ubicaciones según los módulos y funcionalidades que afectan.  Los nombres de los archivos que utilizan este motor obedecen al patrón *.tpl.php.

Los archivos mínimos requeridos son los siguientes.

  • page.tpl.php: contiene la distribución general de la página del tema.
  • <tema>.info: contiene la información de especificación del tema.

El archivo page.tpl.php.

En este archivo se detalla la estructura básica de la presentación de la página del tema.  Su personalización se realiza mediante la manipulación de clases utilizando CSS, además es posible definir plantillas alternativas que definen la presentación de secciones específicas del contenido: bloques (block.tpl.php), secciones (box.tpl.php), comentarios (comment.tpl.php), nodos (node.tpl.php), etc o a tipos de contenido específicos: noticias, artículos de blog, páginas, etc.

Algunas de las variables que se pueden utilizar en el head de los archivos *.tpl.php son las siguientes.

  • $head_title: título de la página.
  • $head: información de la sección head.
  • $styles: las hojas de estilo a incluírse, definidas en <tema>.info.
  • $scripts: los scripts a incluírse, definidos en <tema>.info.

También se incluyen las regiones (placeholders) que conformarán el contenido del tema.  Estas regiones deben registrarse previamente para poder ser utilizadas como tales.

  • $header: cabecera.
  • $left: columna izquierda.
  • $content: contenido (central).
  • $right: columna derecha.
  • $footer: pies de página.

Frecuentemente estas secciones deberán ser incluídas si se satisfacen ciertas condiciones, como por ejemplo, que se encuentren definidas.

<?php if($left): ?>
<div id="sidebar-left">
    <?php print $left; ?>
</div>
<?php endif; ?>

El archivo <tema>.info.

Su nombre corresponde el nombre del tema y la extensión .info, su función es la de definir la especificación y configuración básica del tema.

Este es el contenido del archivo bluemarine.info asociado con el tema con el mismo nombre incluído por defecto en Drupal.

; $Id: bluemarine.info,v 1.4 2007/06/08 05:50:57 dries Exp $
name = Bluemarine
description = Table-based multi-column theme with a marine and ash color scheme.
version = VERSION
core = 6.x
engine = phptemplate

; Information added by drupal.org packaging script on 2009-05-13
version = "6.12"
project = "drupal"
datestamp = "1242243950"

Es posible consultar mayor información al respecto en el documento Estructura del archivo .info.

Enlaces.

Administrando la sesión de usuario con Gnome-Do

Instalación.

Para su uso es necesario activar el complemento GNOME Session Management que pertenece al listado de plugins oficiales.  No se incluyen opciones de configuración adicionales.

Administrando la sesión.

Para realizar cualquiera de las acciones de administración de sesión realice los siguientes pasos.

  1. Presione [Banderita]+Espacio o la combinación que se haya elegido.
  2. Especifique una de las siguientes acciones disponibles.
    • Lock screen
    • Log Out
    • Suspend
    • Hibernate
    • Restart
    • Shutdown
  3. Presione Enter para ejecutar la acción.

Enlaces.

Acortando enlaces con TinyURL desde Gnome-Do

Introducción.

Siguiendo la estrategia de minimizar la pereza y maximizar la productividad que inicie con la publicación en Twitter, hoy tomé 60 segundos de mi vida para revisar como acortar enlaces utilizando TinyURL desde Gnome-Do, es decir, sin tener que visitar el sitio web, llenar un formulario, buscar el enlace generado y copiar su URL.

Instalación.

Para su uso es necesario activar el complemento TinyUrl que pertenece al listado de plugins oficiales.  No se incluyen opciones de configuración adicionales.

Convirtiendo URLs.

Para convertir un URL en su versión corta con realice los siguientes pasos.

  1. Presione [Banderita]+Espacio o la combinación que se haya elegido.
  2. Escriba Make Tiny Url.  Sólo es necesario escribir lo suficiente para que aparezca el texto en la primera sección (acción).
  3. En la segunda sección (orígen) escriba o pegue (CTRL+V) el enlace original que se desea convertir.  No olvide que el URL debe ser válido, es decir, debe incluír el protocolo correspondiente (http://, ftp://, etc.).
  4. Presione Enter y espere un momento mientras se accede al sitio de TinyURL.
  5. Al aparecer el resultado de la conversión copie (CTRL+C) el URL corto o presione Enter para visitarlo.
  6. Presione ESC para terminar Gnome-Do de ser necesario.

Enlaces.

Los archivos de temas en Drupal 6

Introducción.

Los temas (themes) o plantillas (templates) en Drupal se encuentran compuestos por varios archivos: *.theme y *.tpl.php.

La distribución del core incluye seis temas por defecto.

Nombre
EngineTiene tablas ?Es subtema ?
BluemarinePHPTemplateSiNo
ChamaleonPHP planoSiNo
GarlandPHPTemplateNoNo
MarvinPHP planoSiSi
MinnelliPHPTemplateNoSi
PushbuttonPHPTemplateSiNo

Los temas incluídos por defecto en la distribución se ubican en /themes mientras que los temas implementados por el usuario se deberán ubicar bajo /sites/all/themes.

Archivos utilizados.

Tema basado en PHPTemplate.

  • block.tpl.php – Apariencia de los bloques.
  • <tema>.info – Información básica del módulo como nombre, descripción y versión.
  • box.tpl.php – Apariencia de los contenedores de información.
  • comment.tpl.php – Apariencia de los comentarios.
  • logo.png – Imagen del logo utilizado en el tema.
  • node.tpl.php – Apariencia de los nodos.
  • page.tpl.php – Apariencia y distribución de la página.
  • screenshot.png – Imagen del tema para ilustrar su administración.
  • style-rtl.css – Estilo para temas con textos de derecha a izquierda.
  • style.css – Hoja de estilos principal.

Es posible redefinir partes específicas del tema creando archivos cuyo nombre corresponde al elemento que se desea alterar siguiendo el formato *.tpl.php.

Tema basado en PHP directamente.

  • background.png – Imagen utilizada de fondo.
  • <tema>.infoInformación básica del módulo como nombre, descripción y versión.
  • <tema>.theme - Apariencia y distribución de la página.
  • common-rtl.css – Estilo alternativo para los elementos comúnes con textos de derecha a izquierda.
  • common.css - Estilo para los elementos comúnes.
  • logo.png – Imagen del logo utilizado en el tema.
  • style-rtl.css – Estilo para los elementos específicos del tema con textos de derecha a izquierda.
  • style.css - Estilo para los elementos específicos del tema.

Es posible especificar archivos *.theme para redefinir la presentación de elementos específicos del tema.

Enlaces.

Utilizar GMail como SmartHost desde Linux Debian 5

Introducción.

Un servidor que utilizo frecuentemente para el desarrollo de aplicaciones web que se encuentra basado en Debian 5 no estaba enviando los correos de las aplicaciones ni de un par de scripts que había escrito hace un tiempo para la creación de copias de seguridad.

Al revisar los logs encontré este mensaje: Mailing to remote domains not supported.

La solución es realizar la configuración del Exim 4, sin embargo tenía un detalle adicional que lo hacía interesante.  Para la empresa propietaria del servidor estoy utilizando Google Apps para gestionar su correo electrónico, así que el SmartHost tenía que ser con GMail, SSL (el puerto indicado) y autenticación.

Procedimiento.

Para este procedimiento se supone que el nombre del servidor es desarrollo.dominio.com.

1. Crear una cuenta de correo en GMail/Google Apps para el relay del servidor de correo.

Nombre de usuario: desarrollo_relay
Contraseña: password_relay

2. Realizar la configuración de Exim.

$ su -

$ dpkg-reconfigure exim4-config

  • General type of mail configuration: mail sent by smarthost; received via SMTP or fetchmail
  • System mail name: localhost
  • Ip Address to listen on: 127.0.0.1
  • Other destinations~: desarrollo.dominio.com
  • Machines to Relay for: <vacío>
  • IP address or hostname of the outgoing smarthost: smtp.gmail.com::587
  • Hide local mail name in outgoing mail: No
  • Keep number of DNS queries minimal: No
  • Delivery method for local mail: mbox format in /var/mail/
  • Split configuration into small files: Yes

3. Configurar la información del cliente de acceso.

$ vi /etc/exim4/passwd.client

gmail-smtp.l.google.com:desarrollo_relay@dominio.com:password_relay
*.google.com:desarrollo_relay@dominio.com:password_relay
smtp.gmail.com:desarrollo_relay@dominio.com:password_relay

$ chmod 640 /etc/exim4/passwd.client

$ chown root:Debian-exim /etc/exim4/passwd.client

4. Actualizar la lista de correspondencias de direcciones de correo.

$ vi /etc/exim4/email-addresses

root@localhost:    desarrollo_relay@dominio.com

$ chmod 640 /etc/exim4/email-addresses

5. Verifique la configuración actual del Exim.

$ vi /etc/exim4/update-exim4.conf

dc_eximconfig_configtype='smarthost'
dc_other_hostnames='desarrollo.dominio.com'
dc_local_interfaces='127.0.0.1'
dc_readhost='desarrollo.dominio.com'
dc_relay_domains="
dc_minimaldns='false'
dc_relay_nets="
dc_smarthost='smtp.gmail.com::587'
CFILEMODE='644'
dc_use_split_config='true'
dc_hide_mailname='false'
dc_mailname_in_oh='true'
dc_localdelivery='mail_spool'

6. Reiniciar el servicio del MTA.

$ /etc/init.d/exim4 restart

Enlaces.