17 de diciembre de 2015

:: Errores en la gestión del desarrollo de software

En 1996, Steve McConnel, un destacado consultor de la industria del desarrollo del software, publicó su obra "Desarrollo Rápido: Domesticando Cronogramas Salvajes de Software" (Rapid Development: Taming Wild Software Schedules).

Uno de los capítulos del libro, describe los errores clásicos al tratar de acelerar (o hacer Fastrack) de los proyectos, prácticas de desarrollo de software que son aplicadas con frecuencia y con los mismos resultados pésimos predecibles, y que siguen estando vigentes a pesar que la obra se público hace 17 años.

¿Te suena alguna?. Quizás podrían añadirse muchas otras

A continuación los errores clásicos en proyectos de desarrollo de software de Steve McConnel:

Gestión de Personal
Procesos
Producto
Tecnología
1.     No dar importancia a la motivación.
2.     Aceptar personal con debilidades.
3.     No controlar a empleados problemáticos.
4.     Privilegiar el “Heroismo” en lugar del buen desempeño continuo.
5.     Incorporar personal a un proyecto retrasado.
6.     Permitir oficinas ruidosas, con muchas personas.
7.     Permitir la fricción entre desarrolladores y el cliente (los usuarios).
8.     Comprometer expectativas no realistas.
9.     Carecer de patrocinio efectivo.
10.  Carecer de apoyo de interesados (stakeholders).
11.  No involucrar a los usuarios finales.
12.  Privilegiar la politiquería sobre los resultados.
13.  Exceso de optimismo.
14.  Permitir cronogramas optimistas.
15.  No gestionar  los riesgos o gestionarlos de forma insuficiente.
16.  Usar contratistas y no gestionarlos.
17.  Planificar de forma insuficiente.
18.  Abandonar la planificación al estar bajo presión.
19.  No aprovechar el tiempo mientras el proyecto es aprobado.
20.  Ir directo a la programación sin hacer análisis y diseño.
21.  Diseñar de forma inadecuada.
22.  Omitir revisiones, inspecciones de código y pruebas, al estar bajo presión.
23.  Insuficiente control por parte de la Gerencia.
24.  Integración prematura o muy frecuente del producto.
25.  Omitir tareas esenciales en las estimaciones.
26.  Planificar para recuperar el retraso después.
27.  Programación alocada (Code Like Hell).

28.  Incluir al principio requerimientos no necesarios realmente (Gold Plating).
29.  Permitir constantes cambios en los requerimientos, sin aplicar controles.   (Feature Creep).
30.  Incluir requerimientos técnicos no necesarios (Developer Scrope Creep).
31.  Modificar el cronograma para corregirlo, pero luego agregar más esfuerzo y tareas.
32.  Desarrollo orientado a la investigación (Hacer investigación de Software en lugar de desarrollo de software).
33.  Síndrome de la bala de plata. (Asumir que la misma solución funciona para todo).
34.  Sobrestimar los ahorros que se pueden obtener al implementar nuevos métodos o herramientas.
35.  Cambiar herramientas en el medio del proyecto.
36.  Carecer de automatización de control de código 

22 de noviembre de 2015

:: Liferay. Soporte para nuevo idioma

Si bien Liferay da soporte a multitud de idiomas, puede ser que en un momento determinado tengamos que incluir uno nuevo no soportado por defecto.
En nuestro caso, para dar soporte al Asturiano (Bable) hemos seguido los siguientes pasos que describimos a continuación.

.- Añadir la siguiente entrada en el fichero portal-ext.properties
locales=ar_SA,eu_ES,bg_BG,ca_AD,ca_ES,zh_CN,zh_TW,hr_HR,cs_CZ,da_DK,nl_NL,nl_BE,en_US,en_GB,et_EE,fi_FI,fr_FR,gl_ES,de_DE,el_GR,iw_IL,hi_IN,hu_HU,in_ID,it_IT,ja_JP,ko_KR,lo_LA,nb_NO,fa_IR,pl_PL,pt_BR,pt_PT,ro_RO,ru_RU,sr_RS,sr_RS_latin,sl_SI,sk_SK,es_ES,sv_SE,tr_TR,uk_UA,vi_VN, ast_ES

.- Copiar el icono de la bandera en:  (HOOK)
C:\liferay-portal-6.1.1-ce-ga2\tomcat-7.0.27\webapps\ROOT\html\themes\control_panel\images\languageC:\liferay-portal-6.1.1-ce-ga2\tomcat-7.0.27\webapps\ROOT\html\themes\classic\images\language

.- En el fichero web.xml ubicado en la siguiente ruta: (PLUGIN -EXT)
C:\liferay-portal-6.1.1-ce-ga2\tomcat-7.0.27\webapps\ROOT\WEB-INF
Añadir las siguientes lineas:
< servlet-mapping >
                               < servlet-name >I18n Servlet</ servlet-name >
                               < url-pattern >/ast/*</ url-pattern >
</ servlet-mapping >
< servlet-mapping >
                < servlet-name >I18n Servlet</ servlet-name >
                < url-pattern >/ast_ES/*</ url-pattern >
</ servlet-mapping >

< url-pattern >/ast/c/portal/protected</ url-pattern >

< url-pattern >/ast_ES/c/portal/protected</ url-pattern >

.- Añadir los ficheros de traducciones siguientes:  (HOOK)
language_ast.properties
language_ast_ES.properties
.- Copiar los ficheros anteriores en la siguiente ruta:
C:\liferay-portal-src-6.1.1-ce-ga2\portal-impl\src\content

.- Establecer las preferencias de presentación en:
Portal > Configuración > Preferencias de presentación
es_ES,ast_ES

.- El fichero de recursos tienen que llamarse: Language_ast_ES.properties
En las pruebas realizadas, no cogía las traducciones utilizando Language_ast.properties, por lo que únicamente se utiliza Language_ast_ES.properties

.- En el fichero “liferay-hook.xml” es necesario añadir la entrada siguiente:

content/Language_ast_ES.properties

Estas son algunas guías básicas que pueden contener errores, por lo que cualquier aportación siempre es
 bienvenida.

19 de noviembre de 2015

:: Liferay. Generar fichero .ICS desde Velocity

Para generar un fichero .ICS con los eventos de la agenda desde una plantilla Velocity en el CMS Liferay, el código a utilizar es el siguiente:


#set ($serviceContext = $portal.getClass().forName("com.liferay.portal.service.ServiceContextThreadLocal").getServiceContext())
#set ($httpServletRequest = $serviceContext.getRequest())
##get the real themeDisplay object, not the $themeDisplay map
#set ($objThemeDisplay = $httpServletRequest.getAttribute("THEME_DISPLAY"))

#set ($exportURL = $portletURLFactory.create($httpServletRequest, "8", $objThemeDisplay.getPlid(), "ACTION_PHASE"))
#set ($temp = $exportURL.setWindowState("exclusive"))
#set ($temp = $exportURL.setPortletMode("view"))
#set ($temp = $exportURL.setParameter("struts_action", "/calendar/export_events"))
#set ($temp = $exportURL.setParameter("exportFileName", "events.ics"))


Sobre la capa con la clase "export-ics" aplicaremos los estilos que sean necesarios.

:: Doxygen. Generador de documentación

Existen multitud de herramientas para documentar el código fuente, pero hoy describiremos brevemente una de ellas, utilizada ampliamente y con una reducida curva de aprendizaje.

Según la definición que figura en la Wikipedia, Doxygen es un generador de documentación para C++, C, Java, Objective-C, Python, IDL (versiones Corba y Microsoft), VHDL, PHP, C# y D.
Dado que es fácilmente adaptable, funciona en la mayoría de sistemas Unix así como en Windows y Mac OS X. La mayor parte del código de Doxygen está escrita por Dimitri van Heesch.


Un ejemplo de comentarios para documentar una clase:
/**
 * @class DBConnection
 * @author Nombre de empresa o autor
 * @version 1.0
 * @date 2015-11-13
 * @brief Clase para crear conexiones a la base de datos basandose perfiles que encapsula
 * a la clase PDO de PHP.
 * @file   DBConnection.php
 * @todo Tareas pendientes a realizar
 * - Primera cosa pendiente
 * - Segunda cosa pendiente
 * - Tercera cosa pendiente
 */
/**
 * Esta clase establece las conexiones a la base de datos basándose en perfiles que encapsula
 * a la clase PDO de PHP.
 * Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet ,
 * Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet ,
 * Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet
 * Lorem ipsum dolor sit amet .
 * Lorem ipsum dolor sit amet .
 */ 
Una vez configurado doxygen con la ubicación del código fuente y la carpeta en la que almacenará la salida (en el formato seleccionado), recorrerá los ficheros buscando las directivas correspondientes (@class, @author, @version,....) generando la documentación.
Su uso es muy sencillo y una vez comentado nuestro código fuente, la herramienta nos facilitará la generación de la documentación en un formato que nos permitirá su consulta de una forma ágil.


Información y descarga: http://www.stack.nl/~dimitri/doxygen/

16 de noviembre de 2015

:: Wordpress. Error: "No input file specified"

En alguna que otra ocasión, tras la instalación de Wordpress el portal devuelve el siguiente error al intentar acceder a cualquiera de las páginas: "No input file specified".

Esta situación suele producirse en algunos servicios de hosting, para lo que es importante leer la documentación, evitando perder tiempo en búsquedas de posibles soluciones.


En el caso del servicio de hosting Aruba, la solución al problema consistirá en seguir los siguientes pasos.
1.- Desde el panel de administración web deberemos seleccionar: "Hosting Linux > Hosting Services"

2.- Tras mostrar las distintas opciones, seleccionaremos la entrada: "Personalización del archivo PHP.INI".
 

3.- Entre las opciones disponibles seleccionaremos la opción: "cig.fix_pathinfo"


De esta manera, tras seleccionar la opción citada anteriormente, todas las entradas del portal funcionarán correctamente.

11 de noviembre de 2015

:: Liferay. Comprobar si una página es pública o privada

Cuando estamos desarrollando en Liferay, en alguna ocasión necesitamos saber si una página es pública o privada.
Para llevar a cabo esta tarea en este CMS, podemos hacerlo desde Velocity con el siguiente código:
#if($layout.isPublicLayout())
#else
#end
Para cada petición "request", $layout representa la página actual a cargar.
De esta manera, el código anterior podemos insertarlo en cualquier plantilla Velocity que tengamos en el tema, normalmente en:

  • portal_normal.vm
  • init_custom.vm

8 de noviembre de 2015

Servidores. Entendiendo la memoria

Un diagrama para entender un poco más la memoria.

YoungGen: Es el lugar donde se almacenan datos durante un corto periodo de tiempo, y está dividida en dos partes:
  • Eden Space: Cuando un objeto se crea con el método "new", se reserva memoria en este espacio.
  • Survivor Space: Es la cola en la que permanecen los objetos tras un proceso "garbage collection" realizado sobre "Eden Space".
Tenured Generation: Esta cola de memoria contiene objetos que han "sobrevivido" después de múltiples procesos "garbage collection" realizados sobre "Survivor Space".
  • OldGen : Esta cola contiene básicamente espacio físico y virtual (reservado) en el que permanecerán aquellos objetos que "han sobrevivido" tras un proceso "garbage collection" realizado sobre el espacio "YoungGen".
Permanent Generation: Como su propio nombre indica, esta cola de memoria contiene clases, metadatos y descriptores de información por lo que el espacio "PermGen" siempre está reservado para clases y todo aquello ligado a estas, como por ejemplo miembros estáticos.
Java8 Update: PermGen se ha reemplazado por Metaspace, que es muy similar.
La diferencia principal es que "Metaspace" redimensiona el tamaño dinamicamente, por ejemplo: Espacio Java Metaspace: ilimitado (por defecto)
Code Cache (Virtual or reservado) : Si estamos utilizando la Máquina Virtual HotSpot esta incluye el área "Code Cache" que contiene la memoria que será utilizada para compilación y almacenamiento de código nativo.

:: Liferay. Crear usuarios sin correo electrónico

En ocasiones es necesario crear usuarios en Liferay sin que estos lleven asociada una dirección de correo electrónico. Para ello deberemos editar el fichero portal-ext.properties y añadir la siguiente linea:
users.email.address.required=false
Podemos añadir además la siguiente linea para que al usuario se le genere -de forma automática- una dirección de correo electrónico:
users.email.address.auto.suffix=@dominio.extension

Donde el literal "dominio.extension" lo sustituiríamos  por el que sea necesario, por ejemplo: "netic360.com"

De esta manera, se crearían usuarios sin especificar una dirección de correo electrónico, generándose una -de forma automática- para estos.

30 de octubre de 2015

:: Liferay. Problema con Javascript minifier

Aunque el funcionamiento del código era correcto, al acceder por primera vez a ese contenido (en este caso en un portal desarrollado sobre el CMS Liferay), en el log aparecía un mensaje de error similar a este:

ERROR [ajp-8009-1][MinifierUtil:101] 71: 73: missing name after . operator
ERROR [ajp-8009-1][MinifierUtil:101] 1: 0: Compilation produced 1 syntax errors.
ERROR [ajp-8009-1][MinifierUtil:79] JavaScript Minifier failed for

Al tratarse de un error de sintaxis, la primera tarea fue comprobar que efectivamente no existiera algún error sintáctico en el código. Tras perder un poco de tiempo, aparentemente, todo era correcto aunque en el log el mensaje seguía apareciendo.

En una de las lineas del código aparecía lo siguiente (cuya sintaxis es correcta):
video.thumbnail=response.items[i].snippet.thumbnails.default.url;

Tras buscar alguna solución, encontré algo relacionado con el "dot notation" y "bracket notation".
video.thumbnail=response.items[i].snippet.thumbnails['default'].url;

La solución para evitar ese mensaje de error en el log, era sustituir la palabra reservada "default" por la codificación utilizando "bracket notation".


27 de octubre de 2015

:: Alfresco. Cómo deshabilitar la cuenta de invitado

En una implantación del gestor documental Alfresco puede ser interesante deshabilitar la cuenta de invitado.
Una forma de llevar a cabo esta tarea es modificando el fichero: "alfresco-global.properties" añadiendo la siguiente línea:
alfresco.authentication.allowGuestLogin=false

22 de septiembre de 2015

:: Obtener la versión de wordpress

Cuando desarrollamos un portal en Wordpress quizás deberíamos ocultar la versión con la que fue desarrollado ya que ello podría constituir una vulnerabilidad.
Esta información podemos encontrarla en dos ficheros: 1.- La meta etiqueta "generator"
Esta metaetiqueta se genera en el fichero "header.php" de la forma siguiente:
<meta name="generator" content="WordPress <?php bloginfo('version'); ?>" />

2.- El fichero readme.html ubicado en el raíz del sitio e incluido en cada instalación estándar de Wordpress.

Las soluciones serían:
  • En el primer caso sobreescribir este contenido para no mostrar la información que estamos comentando
  • Eliminar o sobreescribir el fichero readme.html

1 de enero de 2015

:: Upload de ficheros. Error: Objeto Request error 'ASP 0104 : 80004005'

En el desarrollo con ASP al intentar subir un fichero al servidor obtenemos el siguiente mensaje de error:
Objeto Request error 'ASP 0104 : 80004005'

En la mayoría de las ocasiones indica que se ha producido un fallo al intentar subir el fichero al servidor web debido a que el tamaño máximo configurado para la subida de ficheros es menor que el tamaño del mismo.

Para modificar este valor, debemos ir a la carpeta del IIS (Internet Infomation Services) ubicada en la siguiente ruta y buscar el fichero:
c:\windows\system32\inetsrv\metabase.xml

Dentro del fichero buscaremos la entrada: "AspMaxRequestEntityAllowed="204800"

Por defecto, en w2003 Server, el tamaño máximo son 200KB por lo que modificaremos este valor según nuestras necesidades.

:: Cookies de nuestra página web. ¿Para qué sirve cada una?

A menudo una pregunta que nos hacen es qué cookies se están utilizando en mi página y para qué sirven. Para ver las cookies, podemos selecci...