martes, 12 de marzo de 2013

Hibernate InvalidMappingException

Trabajando con Hibernate, en una relación 1-n bidireccional, obtuve un error en un mapeo

SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Initial SessionFactory creation failed.org.hibernate.InvalidMappingException: Could not parse mapping document from resource comentario1nbi.hbm.xml
Exception in thread "main" java.lang.NullPointerException
    at com.blog.dao.PostDAO.crearPost(PostDAO.java:48)
    at com.hib.TestHibBlog.main(TestHibBlog.java:26)



Esto surgía, porque en comentario1nb1.hbm.xml había puesto  como name el nombre de la tabla, y debe ser el del VO
 
  <many-to-one name="postVO" column="idPost"  />



<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
 <class name="com.blog.vo.Comentario1nBiVO" table="comentarios1nBi">
  <id name="id" type="int" column="id" >
   <generator class="identity"/>
  </id>
 
  <property name="cuerpo">
   <column name="cuerpo" />
  </property>
  <property name="fecha">
   <column name="fecha"/>
  </property>
 
  <!-- muchos comentarios pertenecen a un post
  indico el nombre del atributo dentro
  de Comentario1nBiVO al cual haré referencia
  con mi clave.
  La columna es la columna de posts, que es clave. -->
  <many-to-one name="postVO" column="idPost"  />
 </class>
</hibernate-mapping>



<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
 <class name="com.blog.vo.Post1nBiVO" table="posts1nBi">
  <id name="id" type="int" column="idPost" >
   <generator class="identity"/>
  </id>

  <property name="idAutor" type="int" column="idAutor"/>

  <property name="fecha">
   <column name="fecha" />
  </property> 
  <property name="titulo">
   <column name="titulo" />
  </property>
  <property name="contenido">
   <column name="contenido"/>
  </property>
 
  <list name="comentarios" cascade="all-delete-orphan">  
     <key column="idPost" /><!-- cuál columna de la tabla post será la clave externa -->
    <index column="ORDEN" />  <!-- para guardar en el mismo orden, una columna nueva -->
    <!-- ahora sí indico que hay una relación de 1 a n -->
    <one-to-many class="com.blog.vo.Comentario1nBiVO" />
  </list>

 </class>
</hibernate-mapping>




package com.blog.vo;

import java.util.Date;

public class Comentario1nBiVO {
        private int id;
        private String fecha;
        private Post1nBiVO postVO;
       
       
        public Comentario1nBiVO() {
            super();
            // TODO Auto-generated constructor stub
        }
        public Comentario1nBiVO(String fecha, String cuerpo) {
            super();
            this.fecha = fecha;
            this.cuerpo = cuerpo;
        }
        private String cuerpo;
        /**
         * @return the id
         */
        public int getId() {
            return id;
        }
        /**
         * @param id the id to set
         */
        private void setId(int id) {
            this.id = id;
        }
       
        /**
         * @return the fecha
         */
        public String getFecha() {
            return fecha;
        }
        /**
         * @param fecha the fecha to set
         */
        public void setFecha(String fecha) {
            this.fecha = fecha;
        }
        /**
         * @return the cuerpo
         */
        public String getCuerpo() {
            return cuerpo;
        }
        /**
         * @param cuerpo the cuerpo to set
         */
        public void setCuerpo(String cuerpo) {
            this.cuerpo = cuerpo;
        }
        /**
         * @return the postVO
         */
        public Post1nBiVO getPostVO() {
            return postVO;
        }
        /**
         * @param postVO the postVO to set
         */
        public void setPostVO(Post1nBiVO postVO) {
            this.postVO = postVO;
        }

       
}




package com.blog.vo;

import java.util.ArrayList;
import java.util.List;

public class Post1nBiVO {

        private int id;
        private int idAutor;
        private String fecha;
        private String titulo;
        private String contenido;
        private List comentarios=new ArrayList();
       
        /**
         * DEBE EXISTIR UN CONSTRUCTOR POR DEFECTO PARA QUE
         * HIBERNATE FUNCIONE
         */
        public Post1nBiVO(){
            super();
        }
       
    public Post1nBiVO(int idAutor, String fecha, String titulo, String contenido) {
        super();
        this.idAutor = idAutor;
        this.fecha = fecha;
        this.titulo = titulo;
        this.contenido = contenido;
    }       
   
    public void addComentario(Comentario1nBiVO comentario){
        comentarios.add(comentario);
    }
       
        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

       
        public String getFecha() {
            return fecha;
        }
        public void setFecha(String string) {
            this.fecha = string;
        }
        public String getTitulo() {
            return titulo;
        }
        public void setTitulo(String titulo) {
            this.titulo = titulo;
        }
        public String getContenido() {
            return contenido;
        }
        public void setContenido(String contenido) {
            this.contenido = contenido;
        }

        /**
         * @return the idAutor
         */
        public int getIdAutor() {
            return idAutor;
        }

        /**
         * @param idAutor the idAutor to set
         */
        public void setIdAutor(int idAutor) {
            this.idAutor = idAutor;
        }

        /**
         * @return the comentarios
         */
        public List getComentarios() {
            return comentarios;
        }

        /**
         * @param comentarios the comentarios to set
         */
        public void setComentarios(List comentarios) {
            this.comentarios = comentarios;
        }
       
       
}











jueves, 28 de febrero de 2013

Excepción en Hibernate

Esta excepción a mí me ocurrió cuando estaba intentando actualizar un registro de cuyo id no tenemos existencia en la base de datos, porque acababa de ser borrado.


org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
    at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:85)
    at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:70)
    at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:90)




lunes, 25 de febrero de 2013

Hacer un redirect con struts

Problema: He creado un post, y el forward me llevó al listado de post, sin embargo, como la url es /crearActionPost.do  , si le doy a refrescar me volverá a crear el mismo post.  Quiero que me cambie la url, para que aunque refresquen, sea imposible volver a crear el mismo post, que para crear un post, deban iniciar el proceso.

Solución:

   Esto sería lo que tendría habitualmente:  //return mapping.findForward("mostrarTodo");
 Esta, una primera aproximación: 
    // ActionForward ac = mapping.findForward("mostrarTodo");
    // ac.setRedirect(true);
    //return ac;
   En realidad ActionForward, hereda de ForwardConfig, entonces, puedo decirle, que quiero que 
vaya al listado pero indicándole que haga un redirect:       
    ForwardConfig f = new ActionRedirect(mapping.findForward("mostrarTodo"));
    f.setRedirect(true);
    return (ActionForward) f;

html:href .vs. a href

Problema:  Queremos llamar desde una jsp a un action de struts.
Posibilidades:  Usar una etiqueta "a" de html o usar una etiqueta "Conclusión:  Mejor usar la de Struts, puesto que relativiza y puedes llamar a un action sin .do y sin tener en cuenta dónde desde dónde haces la llamada.  Peor si quieres imprimir varios parámetros o usar el <bean:write>


<%@ page language="java" contentType="text/html; charset=ISO-8859-1"

    pageEncoding="ISO-8859-1"%>

    <%@page import="vo.PostVO" %>

    <%@page import="java.util.LinkedList" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>

<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>

<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">

<title></title>

</head>

<body>

<logic:iterate name="listaPost"  scope="session" id="post" >

    <bean:write property="titulo" name="post"/>

    <bean:write property="descripcion" name="post"/>

    <bean:write property="fecha" name="post"/>

    <a href="postAction.do?method=detallesPost&id=<bean:write property="id" name="post"/>">Más detalles...</a></br></br>

</logic:iterate> 
 
 
<!--


OPCIÓN 1:

con a href, debo buscar la ruta relativa y colocar el .do 

--> 
 <a href="../crearPost.do">Crear nuevo Post</a>
 
 
<!--

OPCIÓN 2:con html:link, no es necesario colocar .do ni las relativas

-->  


 <html:link action="crearPost">Crear nuevo Post versión pro</html:link> 
 
<!--


OPCIÓN 3:con html:link, pasándole un parámetro ID, donde adquiere el valor que tendrá la propiedad id dentro del form llamado post

http://localhost:8080/nombre_proyecto/crearPost.do?method=crear&titulo=4&ID=2

--> 

 
 <html:link action='crearPost?method=crear&titulo=4' paramName="post" 
paramProperty="id" paramId="ID" >Crear nuevo Post versión pro</html:link>



</body>

</html>






lunes, 21 de enero de 2013

Hibernate desde 0 usando Struts 1.3.10

Hoy me topé con la necesidad de integrar Hibernate junto con Struts, y aquí os dejo unos pasos y unos buenos tutoriales

1.-Me bajé el zip con el contenido de hibernate.  https://sourceforge.net/projects/hibernate/?source=dlp  y en el eclipse, en la carpeta lib, metí los jars siguientes:
  • Los que estaban dentro de required ( hibernate-distribution-3.6.10.Final-dist\hibernate-distribution-3.6.10.Final\lib\required) : antlr-2.7.6, commons-collections-3.1, dom4j-1.6.1, javassist-3.12.0.GA, jta-1.1,  slf4j-api-1.6.1
  • Los de hibernate propiamente dicho (\hibernate-distribution-3.6.10.Final-dist\hibernate-distribution-3.6.10.Final) : hibernate3  e hibernate3testing 
  • El de JPA (hibernate-distribution-3.6.10.Final-dist\hibernate-distribution-3.6.10.Final\lib\jpa):  hibernate-jpa-2.0-api-1.0.1.Final
    • Este jar hay que meterlo para evitar la excepción Exception in thread “main” java.lang.NoClassDefFoundError: javax/persistence/EntityListeners    (solución hallada en http://technicalrecyclebin.wordpress.com/category/j2ee/hibernate/ )
2.-Metí en mi proyecto el jar de un conector de mysql, en mi caso:  mysql-connector-java-5.1.22-bin.jar

3.-Yo seguí un muy buen tutorial de creación de la aplicación, donde tras indicarte los ficheros que tienes que crear te brinda la oportunidad de dejar la prueba ejecutada
http://blog.sencide.com/2011/03/hibernate-tutorial-for-beginners.html

4.-Para ese mismo tutorial, os dejo los scripts de creación de mysql, puesto que , tuve algún error, por ejemplo, se me olvidó crear las claves primaras como autoincremental, y si no lo hacía, me salía el siguiente error:   org.hibernate.HibernateException: The database returned no natively generated identity value  o también otro que indicaba que no tenía un valor por defecto en el id.  OJO, yo le llamé a la base de datos, hibernatestruts  (con lo cual difiere del ejemplo del tutorial)

delimiter $$

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `first_name` varchar(100) DEFAULT NULL,
  `last_name` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8$$

delimiter $$

CREATE TABLE `tasks` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NULL,
  `title` varchar(100) DEFAULT NULL,
  `description` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8$$

SELECT * FROM hibernatestruts.users;

delimiter $$

CREATE TABLE `tasks` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NULL,
  `title` varchar(100) DEFAULT NULL,
  `description` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8$$

SELECT * FROM hibernatestruts.users;

5.-Una vez que ejecuté como una aplicación Java el test.  Procedí a introducirlo con Struts.  Para ello, tenía una aplicación creada con el struts-blank de la versión 1.3.10, creé un Action para poder ejecutar mi código y seguí el siguiente tutorial:

http://bernabetorres.wordpress.com/2011/07/27/integracion-de-hibernate-en-struts-1-3-10/

y este

http://www.mkyong.com/struts/struts-hibernate-integration-example/


6.-Finalmente, me leí una documentación adicional

Introducción resumida:  http://hareenlaks.blogspot.com.es/2011/03/introduction-to-hibernate.html
Introducción: http://docs.jboss.org/hibernate/core/3.5/reference/en/html/tutorial.html
Lenguaje HQL:  http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html
Variado: http://viralpatel.net/blogs/introduction-to-hibernate-framework-architecture/

7.-No olvidar, una buena herramienta para el eclipse (en mi caso eclipse Juno)
http://marketplace.eclipse.org/node/420896#.UP0aLoaTrIU

lunes, 10 de diciembre de 2012

Poder ver ficheros ocultos en el mac

Cuando quiero ver carpetas ocultas o ficheros ocultos, por ejemplo, lo necesitaba para ver ficheros .svn de un determinado proyecto.

En el mac es necesario ejecutar por consola lo siguiente:

miMAC:~ miusuario$ defaults write com.apple.finder AppleShowAllFiles TRUE
miMAC:~ miusuario$ killall Finder
miMAC:~ miusuario$

sábado, 7 de abril de 2012

Gestiona tu propia publicidad a través de Google DFP Small Business

Seguramente os habreis topado o escuchado, que cuando un determinado portal alcanza éxito o llega a un determinado público, pueden requerirle la colocación de publicidad.

La gestión de la publicidad y la atención de dichas peticiones puede no ser una tarea fácil si tenemos que controlar a quién se muestra, en qué horario, durante qué fechas y en qué proporción (número de veces que se muestra o número tope, o la distribución de los anuncios entre el rango de fechas,...)

Hay varias vías de enfocarlo:
  • Si se intenta controlar de forma manual, no tendremos un aprovechamiento correcto del espacio ya que, colocaremos durante todo un día una publicidad que no tenía porqué mostrarse tanto tiempo ni a tanta gente, y su espacio podía haber sido usado por más anuncios.
  • Si lo intentamos contratar para que nos realicen determinadas acciones informáticas de cara a controlar todas estas variables, probablemente sea demasiado costoso y no cubriremos todas las necesidades.  Si la demanda es relativamente pequeña sí es una buena solución; ya que, pedimos lo que sabemos que podremos manejar.
  • Hay una solución intermedia, que es aprovechar las herramientas del mercado, y una puede ser incorporar el uso de DFP Small Business de google, para poder tener nosotros mejor control y gestión, y que sean menores los cambios a nivel de programación del portal web. 
Normalmente, para llegar a esta solución hemos pasado por la manual, por la inclusión de google adsense, por realizar algunos cambios a nivel informático, y finalmente, por esta solución intermedia (que también requiere tiempo de experiencia y formación)

martes, 21 de febrero de 2012

Herramienta colaborativa de tareas: Trello

Yo sigo en mi mismo tema de buscar herramientas con las que se pueda organizar mejor un equipo.  He encontrado esta:  Trello www.trello.com

Me parece genial, porque creas tareas, que tienen su propia lista de subtareas que se van marcando como resueltas o no; se asignan personas a las tareas, se votan (por si hay que elegir algo), se ordenan para cambiar su prioridad y se pueden pasar a distintos estados como en un tablero Kanban.  Y además, cualquier cambio que hagas se ve en cualquier navegador que esté viendo el mismo espacio.

En resumen, me encantó.

sábado, 11 de febrero de 2012

Wireframing o bocetado...como le queramos llamar

Aunque parezca obvio en la vida diaria, quizás en muchos trabajos no se hace un bocetado.

Cuando vamos a explicarle una dirección a alguien normalmente dibujamos si no conocen bien el sitio, cuando estamos en el cole dibujamos nuestra casa y la familia, y oh! casualidades de la vida, llega el momento de trabajar y ¿se nos olvida dibujar?.

Después de varios proyectos en el mundo de internet, muchas personas con las que he hablado (clientes, equipo,...), diversos sectores de actividad que he tenido que ver,... me he dado cuenta que además de escribir (importante para detallar), es altísimamente importante el dibujar lo que tenemos en mente (o que los demás dibujen lo que tienen en mente), máxime si es para una web o para gestión.  Porque cada uno se estructura la idea en su cabeza y aunque hables de lo mismo, el resultado puede no ser igual (nadie dice que mejor ni peor).  ¿Qué permite esto?, reducir costes, estimar adecuadamente, establecer adecuadamente funcionalidades y requerimientos,... pero eso sí, no es la panacea, asumamos que habrá cambios o ajustes; incluso en una casa los llega a haber.

Pues bien, para todo esto, realizo el dibujo de pantallas (previo a diseño gráfico incluso) con varias herramientas, normalmente uso el Visio, pero hoy quería probar una con un aspecto más "desenfadado" y "alegre"... y me ha gustado, se llama Balsamiq Mockups, y realmente es muy fácil e intuitiva.  Yo la instalé en el Mac, pero tiene plugins para usarlo con herramientas de gestión de proyectos.  Eso sí, no es gratis, tienes una demo online y otra de escritorio para poder probarla y evaluar.



miércoles, 26 de octubre de 2011

Instalando VirtualBox en Mac Darwin

Yo sigo instalando máquinas virtuales allí, por donde voy :), hoy me toca hacerlo para poder instalar un curso de inglés que sólo funciona en Windows.

Pues bien, a ello:

  1. Descargar el .dmg https://www.virtualbox.org/wiki/Downloads   VirtualBox 4.1.4 for OS X hosts x86/amd64
  2. Una vez bajado, doble click en el dmg hasta instalar el VirtualBox
  3. Ahora toca instalar el espacio para la máquina virtual
    1. Nombre de la máquina.  Seleccioné también el tipo de sistema operativo que llevará
    2. Memoria Ram: 786
    3. Disco Duro Nuevo.  También indiqué el check de disco duro de arranque
    4. VDI (Virtual Box Disk Image)
    5. Me pregunta si quiero espacio "Reservado dinámicamente" o "fijo", escojo el primero.
    6. Tamaño del disco duro: 8 Gigas.
    7. Se presenta un resumen y hay que dar a "Crear".
    8. Finalmente, ya vemos la máquina virtual creada.
  4. Doy a "Configuración" y en pantalla indico 64 megas (estaba en 16)
  5. Meto el CD del Windows XP
  6. Ahora doy a "Iniciar", me salen unos avisos de teclas para salir de la máquina virtual, luego me sale el asistente de instalación, y luego le doy a siguiente y ya comienza a instalar el Windows XP.
  7. Una vez instalado, cada vez que queramos entrar sería ir a Aplicaciones -> Virtualbox -> luego seleccionamos nuestra máquina virtual -> Iniciar


martes, 25 de octubre de 2011

Vídeos excelentes optimismo, motivación

Simplemente, teneis que verlo, habla de cómo enfocar la vida: http://www.smilechanneltv.net/optimismo-e-ilusion-emilio-duro/  La mala suerte se pega, la negatividad se pega... yo pienso lo mismo, rodéate de lo positivo

Motivaciónhttp://www.ted.com/talks/lang/spa/dan_pink_on_motivation.html

Liderar y acción:  http://www.ted.com/talks/lang/spa/simon_sinek_how_great_leaders_inspire_action.html

Gestión del Tiempo, algunas técnicas

En el día a día, muchas son las tareas que podemos llegar a tener, bien porque tenemos una tarea que nos ocupa el grueso del tiempo, pero que se subdivide en otras; o bien porque tenemos múltiples tareas (o interrupciones) a lo largo del día.  Entonces, si no manejamos ordenadamente el proceso de ir paso a paso cerrando tareas tendremos un colapso, porque nada llegará a su fin, o llegará de mala manera, y porque cada vez tendremos más.

En cursos de gestión del tiempo y en múltiples grupos/foros, se comentan diversas técnicas.  Finalmente, todo se basa en ser ordenado, y se resume en tener una lista.  Ahora bien, no es cuestión de entrar en múltiples listas, sin ningún orden entre las tareas, y en la que simplemente apuntes y nada se vaya cerrando.  Se trata de tener una lista (con las tareas priorizadas según tu interés, bien porque desbloquean otras tareas, bien porque se cierra un tema, bien porque es para "ya"),  y se trata de "mantener" esa lista con poco esfuerzo, de ir revisándola.  Hay muchas técnicas para esto, pero una podría ser la ZTD (Zen To Done) http://zenhabits.net/zen-to-done-ztd-the-ultimate-simple-productivity-system/

También se trata de tener momentos en los que agrupar tareas pequeñas, ejemplo: hacer llamadas (agrupa un momento para hacer todas las llamadas), responder a e-mails (no vivamos pendientes del correo), enviar e-mails,... y de aprovechar el tiempo para realizar una tarea. En fin, trata de enfocarse en las tareas durante un tiempo, no andar saltando entre todas y no cerrar nada.  Otra técnica que habla de este punto, podría ser la técnica Pomodoro http://www.pomodorotechnique.com/, en donde, un "reloj tomate" te indica durante cuánto tiempo te vas a dedicar sólo a una tarea en específico, para acabarla y acabarla bien.  La tarea que escojas, eso sí, debe ser la correcta en cuanto a prioridad.


Importante: No hacer las cosas que "os aburran" en el peor momento del día, esto quiere decir, que si aborreces hacer informes de seguimiento, no los hagas después de comer, cuando quizás no es el mejor momento para tí.

Importante importantísimo!!:  Cada uno tiene un nivel diferente de urgencias...

Finalmente, me gustó mucho este post, porque refleja, lo que se debe evitar:  www.danielecheverria.com/index.php/urgencias-1/

viernes, 16 de septiembre de 2011

Podcast pmp

Una vez alguien es PMP, o alguien está interesado en su formación dentro de la gestión de proyectos, es útil entrar en redes donde se comparta información (grupos linkedin/xing, propias comunidades de gestión de proyectos,...); compartir con otros gestores de proyectos; estar suscritos a fuentes de noticias, y también escuchar podcasts.

Los podcasts los descubrí buscando cómo obtener pdu's para PMP, y unos que son fáciles de seguir, no demasiado extensos y que además puedes solictar pdu's son los siguientes:  http://www.pducast.com/

Espero que os sirva






jueves, 15 de septiembre de 2011

Servidor de búsquedas o Motor de búsquedas: Sphinx

En proyectos donde se manejan gran cantidad de datos sobre los cuales hay que buscar, el punto importante es la velocidad y el rendimiento, es decir, que busque rápido y que si hay muchas búsquedas a la vez no se degrade la aplicación.

Un buen motor de búsquedas, que sirve como un sistema intermedio entre la base de datos y nuestra capa de acceso a datos puede ser Sphinx:  http://sphinxsearch.com/about/sphinx/  

¿Qué beneficios tiene?, permite la indexación de determinados contenidos (mejorando aún más el acceso a rápido porque facilitas el encontrar por índices lo que luego buscas en base de datos).  Está programado en C++, estando bastante optimizado.

Tiene un gran punto a su favor, que es el que puede usarse en varios tipos de sistemas operativos y en lenguajes de programación


martes, 26 de julio de 2011

Flickr conseguir id

Recientemente instalando unos plugins para leer fotos de una cuenta en Flickr y usarlos en un Wordpress, me topé con que tenía que saber el identificador Flickr.

Pues bien, para obtenerlo fácilmente usé lo siguiente:

http://idgettr.com/

Ahí introduces la dirección de Flickr que tienes creada, y que es algo, que cuando creas la cuenta te dice que luego no lo podrás cambiar. Finalmente, te devuelve el identificador.

lunes, 28 de marzo de 2011

Scrum - Scrum Manager

En estos últimos meses he asistido a un par de cursos de Scrum, para ver cómo estaba la gestión de proyectos desde lo que se llama "gestión de proyectos de manera ágil". En el primero de los cursos, tuve una introducción y en el segundo, ya nos adentramos un poco más, en la visión de Scrum que imparte Scrum Manager.


Acerca de Scrum, podríamos citar a dos "entes" que guían o estructuran los conocimientos Scrum Manager y a Scrum Alliance


Resumo brevemente en qué consiste, según Scrum Manager "es una metodología de desarrollo adaptación continua a las circunstancias de la evolución del proyecto.
Como método ágil:
  • Es un modo de desarrollo adaptable, antes que predictivo.
  • Orientado a las personas, más que a los procesos.
  • Emplea el modelo de construcción incre- mental basado en iteraciones y revisiones.
"
Os dejo un enlace a una introducción a Scrum, disponible en Scrum Manager
http://www.scrummanager.net/ok/mod/resource/view.php?id=30

lunes, 20 de septiembre de 2010

Rumbo a un jefe de proyecto

Interesante podcast, para ver cómo se "convierte" uno a jefe de proyecto (y qué puede significar eso)

http://www.project-management-podcast.com/index.php/episodes/109-episode-062-how-can-i-become-a-project-manager

Hay cosas que comentan, como que debes tener claro lo que quieres ser, para no caer en el caso de una excelente persona técnica y un mal jefe de proyecto (vivan los extremismos...). También comenta el estar en el sitio adecuado y momento adecuado, para que consigas esa oportunidad (o puedas "forzarla")


http://cuttingsedgepm.blogspot.com/2007/02/february-9-2007-how-do-i-become-pm-part.html

¿Qué se concluye? que nadie te obliga, que te tiene que gustar y que muchas de las cosas se aprenden pero debes tener una buena base. Además, expresa, claramente que dedicarse a la gestión de proyectos no implica "ascender", porque puede que te guste y valgas más para la parte técnica (y que incluso ganes más)

http://discuss.joelonsoftware.com/default.asp?design.4.46414.11

Desvelando pros y contras de ser Jefe de Proyecto o Analista de un negocio (área de negocio)...¿la mejor decisión?...depende.

Britney Spears, la gestión de proyectos y un podcast de Gestión de Proyectos

Escuchando un episodio por medio del podcast, me encontré con otro de esos "decálogos", que me llaman la atención. En este caso, está relacionado con canciones de Britney Spears, y las interpretaciones asociadas a la gestión de proyectos. Vale la pena escucharlo.

http://www.project-management-podcast.com/index.php/episodes/180-episode-092-ten-things-you-can-learn-about-project-management-from-britney-spears

10.-No me dejes ser el último en saberlo. Informa a tus interlocutores e interesados en el proyecto. Para bien o para mal, por ejemplo, si vas a terminar una semana antes, infórmalo! porque sino ¿qué hacemos con la gente asignada al proyecto para esa semana?

9.-En la ejecución (movimiento, danza) se ve el 90%. No vale sólo con la presentación inicial, es un todo. Dar lo que necesitan saber en el formato en el que se ha solicitado. Comunicación

8.-Personas "guapas" (en este caso, preparadas) obtienen buenos proyectos=> en particular lo que tiene que ver, es que tenemos que prepararnos "ponernos guapos (preparados)" para esos proyectos, hacernos eficientes,...

7.-Rápate la cabeza para mantener el horario. Es decir, si tienes que cambiar de chip hazlo, analiza lo que está debajo de lo visible, para ver que todo va bien.

6.-Entrentenimiento. Debe haber algo de "entretenimiento" en la gestión de proyectos, se ve patente hasta en

5.-Si huele bien vende bien. No pensar sólo en el éxito del proyecto sino del producto también.

4.-Buscar fondos.

3.-¿E-mail a mi corazón?. El e-mail en un proyecto que va mal, no es la mejor manera; es mejor cara a cara, para no dejar lugar a la interpretación.

2.-Desnudarse=> tengo un plan y creo en él.

1.-Give me baby one more time=> lecciones aprendidas, haz uso de ellas.

martes, 14 de septiembre de 2010

10 cosas que un Jefe de proyecto no quiere oir

Me causó mucha risa este artículo :)

http://www.zdnet.com/blog/careers/10-things-your-it-project-manager-never-wants-to-hear/133

Reuniones efectivas

Como he estado leyendo y escuchando, recientemente sobre este tema (es lo que tiene, conseguir los PDU), voy a lanzar un post con todo el conglomerado, hay cosas que pueden parecer muy obvias, pero esto es como lo de que el sentido común no es el más común de los sentidos; y todos podemos caer u observar determinados errores.

Una reunión cuesta
, y al fin y al cabo es una actividad de negocio. Por tanto, hay que valorar si es mejor una reunión que muchos correos o llamadas telefónicas (que en este caso sería que sí), o valorar que igual no es necesario y se arregla fácilmente con los medios antes indicados (un par de e-mails). ¿No habeis estado nunca en una reunión, de la que salisteis pensando que habiais perdido el tiempo?

Si convocas una reunión, es importantísimo saber lo que quieres tratar y en orden, osea ¿para qué?. Si te convocan a una, sin saber para qué, pregunta, porque las reuniones se preparan; además entre todos los asistentes nos podemos hacer una idea equivocada del objetivo. Además, quiénes son los participantes, porque también por los asistentes puedes saber qué temas "ocultos en agenda" pueden salir... este tipo de cosas genera desconfianza.

Una reunión puede transcurrir, pero es importante, que al finalizar se resuman las conclusiones, acuerdos y tareas designadas que pudieron salir tras la reunión, porque sino, pueden quedar cosas en el tintero.

Tiempo estimado. La piedra angular, aunque particularmente no me gustan las reuniones de más de 1 hora, es posible, que si estais resolviendo varios puntos sea mejor seguir, bien por distancia entre los que se reunen, o por agenda, o porque están quedando claros los temas y el volver a retomarlo en otro momento o por otros medios, os lleve más tiempo que extenderlo algo más ahora.

El truco de conseguir atención: es mejor decir ¿cuál es el próximo paso ? en vez de decir hablemos del próximo tema.

Todo esto que puede parecer una tontería, me llamó mucho la atención, porque leí recientemente un ejemplo de un jefe de proyecto que iba desde Estados Unidos a Suramérica, por un tema de urgencia, y cuando llegó allí (un fin de semana...recordemos que era urgente), no se sabía de su llegada ni para qué iba; reconociendo él mismo, que debía haber recibido una confirmación de que alguien le recibiría, que sabría del tema que estaban tratando. Eso por un lado, y por el otro, los que tenían la urgencia, tampoco se ocuparon más, es decir, lanzaron la voz de alarma, pero no fueron consecuentes con la petición.

En un podcast, escuché también de una reunión internacional, que tomó meses organizarla, obviamente, todo esto va dependiendo de los niveles de organización y proyecto.

Leí de los beneficios de las reuniones informales, eso sí, con ojo. Ejemplo, si son varios equipos, de varias empresas o departamentos, muchas veces es más eficaz, salir luego a tomar un café y escuchar "amenamente" diferentes ideas u opiniones y crear lazos, detalles técnicos... esto es con ojo, porque pueden sentarse malas primeras impresiones, es decir, es informal pero no anti-profesional. Con respecto a esto, hay muchos artículos y posts, en los que se debate acerca de los sitios más productivos: máquinas de café, lugares de comida en el trabajo; ya que se habla más amenamente de hechos y problemas, pudiendo obtener otras soluciones o conociendo información que puede evitar problemas en un futuro en proyectos similares.

Ahora bien, por mucho que leas o que escuches, definitivamente, la experiencia (y los errores o buenos resultados) marcan la diferencia