Posted on octubre 4th, 2011 by Alberto Dominguez, PMP
Category: SW Development, Tools
I’ve been thinking and working on a simple idea, that probably will sound bad for some old school project managers. I’ve been living, working, and teaching about the PMI standard for almost 3 years, and I’ve been working on agile software development since forever – because in software development, scope is a moving target so you cannot count on your “printed gantt chart”.
The Idea
To build a simple, extremely simple an online tool (webapp) to handle projects, but no only software projects -which is, I believe, the common approach. Build a set of easy-to-use tools to breakdown work (using drag-and-drop automagic for WBS or even to create Product Backlogs as you will probably build the WBS graphically. I’m not sure about how it will result, but I’m sure you get the point behind the idea. My mind is thinking about a built-in worksheet (like in a spreadsheets tool) to dynamically generate reports that works also as input forms – so you don’t have the Import/Export pain (if you use any online tool every day you know what I’m talking about).
I love little colored pieces of paper, boards (aka information radiators), eDocs with names and tasks and colors (I do love eDocs) – I’m not sure why Google does not have a Project Tool in its office suite.
I’m not sure when, while performing as PM, Professor, Speaker, and VP of Special Projects for PMI Colombia Chapter, I will get the time to work on this personal project.
Posted on noviembre 12th, 2009 by Alberto Dominguez, PMP
Category: Personal, SW Development, Tools, Tags: jboss, jboss portal, portal, portlet, search, search portlet
Few months ago I was developing a project on top of JBoss Portal. Unfortunately, JBoss Portal 2.7.x is a nice Portlet Container but a crappy CMS/Search engine -even when it is supported on Apache’s JackRabbit. However, I was forced to develop a search portlet. It wasn’t easy, and you will probably find that it is not a perfect solution. However I really hope you find this Search Portlet really useful.
SearchPortlet.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
| package portal.portlets;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.GenericPortlet;
import javax.portlet.PortletConfig;
import javax.portlet.PortletException;
import javax.portlet.PortletRequestDispatcher;
import javax.portlet.PortletSecurityException;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import javax.portlet.UnavailableException;
import javax.portlet.WindowState;
import org.apache.log4j.Logger;
import org.jboss.portal.cms.CMS;
import org.jboss.portal.cms.CMSException;
import org.jboss.portal.cms.Command;
import org.jboss.portal.cms.model.File;
import org.jboss.portal.core.cms.ui.CMSPortlet;
import org.jboss.portal.search.FederatedQuery;
import org.jboss.portal.search.QueryConversionException;
import org.jboss.portal.search.federation.SearchFederation;
import org.jboss.portal.search.impl.jcr.JCRQuery;
import org.jboss.portal.search.impl.jcr.JCRQueryConverter;
public class SearchPortlet extends CMSPortlet {
private static Logger log = Logger.getLogger(SearchPortlet.class);
private SearchFederation SearchService;
private CMS CMSService;
public void init(PortletConfig config) throws PortletException {
super.init(config);
}
public void destroy() {
super.destroy();
}
/*
* (non-Javadoc)
*
* @see javax.portlet.Portlet#init()
*/
@Override
public void init() throws PortletException {
this.SearchService = (SearchFederation) getPortletContext().getAttribute("SearchFederationService");
this.CMSService = (CMS) getPortletContext().getAttribute("CMS");
if (this.SearchService == null) {
throw new PortletException("Unable to start search service");
}
if (this.CMSService == null) {
throw new PortletException("CMS services not available");
}
super.init();
}
/*
* (non-Javadoc)
*
* @see javax.portlet.GenericPortlet#doView(javax.portlet.RenderRequest,
* javax.portlet.RenderResponse)
*/
@Override
protected void doView(RenderRequest request, RenderResponse response) throws PortletException, IOException, UnavailableException {
String portalInstance = request.getWindowID().substring(0, request.getWindowID().indexOf('/', 1));
PortletRequestDispatcher prd = null;
String operation = (String) request.getParameter("op");
if (operation != null && operation.equals("search")) {
String queryString = (String) request.getParameter("query");
if (queryString != null && queryString.length() > 0) {
request.setAttribute("files", this.getFiles(queryString, portalInstance));
prd = this.getPortletContext().getRequestDispatcher("/WEB-INF/jsp/results.jsp");
} else {
prd = getPortletContext().getRequestDispatcher("/WEB-INF/jsp/search.jsp");
}
prd.include(request, response);
} else if (operation != null && operation.equals("display")) {
super.doView(request, response);
} else {
prd = getPortletContext().getRequestDispatcher("/WEB-INF/jsp/search.jsp");
prd.include(request, response);
}
}
/*
* (non-Javadoc)
*
* @see javax.portlet.Portlet#processAction(javax.portlet.ActionRequest,
* javax.portlet.ActionResponse)
*/
@Override
public void processAction(ActionRequest request, ActionResponse response) throws PortletException, PortletSecurityException, IOException {
String profile;
String operation = (String) request.getParameter("op");
if (operation != null && operation.length() > 0) {
if (operation.equals("ask")) {
response.setWindowState(WindowState.NORMAL);
} else {
response.setWindowState(WindowState.MAXIMIZED);
}
response.setRenderParameter("op", operation);
} else {
response.setRenderParameter("op", "ask");
response.setWindowState(WindowState.NORMAL);
}
if (operation.equals("search")) {
String queryString = (String) request.getParameter("query");
if (queryString != null && queryString.length() > 0) {
response.setRenderParameter("query", queryString);
}
}
}
private List getFiles(String queryString, String portal) {
List files = null;
List filteredFiles = new ArrayList();
if (queryString != null && queryString.length() > 0) {
FederatedQuery query = new FederatedQuery(queryString);
JCRQueryConverter converter = new JCRQueryConverter();
try {
Command searchCommand = CMSService.getCommandFactory().createSearchCommand((JCRQuery) converter.convert(query));
files = (List) CMSService.execute(searchCommand);
// You can filter files if needed by reviewing its path under the CMS
// structure, by name, or any other criteria that fits your needs.
} catch (CMSException e) {
log.error("CMS Error", e);
} catch (QueryConversionException e) {
log.warn("Conversion Error", e);
}
}
return files;
}
} |
I used two JSP pages to support this portlet.
- search.jsp – Search form – the standard portlet view
- results.jsp – Results list page – appears with the portlet MAXIMIZED and displays CMS files that matches the criteria
search.jsp – (WP-Syntax does not support JSP)
1
2
3
4
5
6
7
8
| <h2>Search</h2>
<form action="<%=contactActionURL%>" method="POST">
<fieldset style="border: none;">
<input name="op" type="hidden" value="search" />
<input name="query" type="text" />
<input type="submit" value="Search" />
</fieldset>
</form> |
results.jsp – (WP-Syntax does not support JSP)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| <%@ page import="org.jboss.portal.cms.model.File"%>
<%@ page import="java.util.List"%>
<%@ page language="java" extends="org.jboss.portal.core.servlet.jsp.PortalJsp"%>
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet"%>
<%
List<File> files = (List<File>) request.getAttribute("files");
if (files != null && files.size() > 0) { %>
<h1>RESULTADOS DE BÚQUEDA</h1>
<%
for (int i = 0; i < files.size(); i++) {
File file = files.get(i);
%>
<h2><%= file.getName() %></h2>
<p><% if (file.getDescription() != null && file.getDescription().length() > 0) { %><%= file.getDescription() %><% } %><a href="<portlet:actionURL><portlet:param name="op" value="display" /><portlet:param name="file" value="<%= file.getBasePath() %>" /></portlet:actionURL>">Ver más...</a></p>
<hr />
<%
}
%>
<% } else { %>
<h1>NO HAY RESULTADOS</h1>
<% } %>
<p align="center"><a href="<portlet:actionURL><portlet:param name="op" value="ask" /></portlet:actionURL>">Volver</a></p> |
Include the following lines on your jboss-portlet.xml file.
1
2
3
4
5
6
7
8
9
10
11
| <service>
<service-name>CMS</service-name>
<service-class>org.jboss.portal.cms.CMS</service-class>
<service-ref>:service=CMS</service-ref>
</service>
<service>
<service-name>SearchFederationService</service-name>
<service-class>org.jboss.portal.search.federation.SearchFederation</service-class>
<service-ref>:service=SearchFederationService</service-ref>
</service> |
And finally add the following lines on your portlet.xml file.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| <portlet>
<description>DESC</description>
<portlet-name>SearchPortlet</portlet-name>
<display-name>NAME</display-name>
<portlet-class>portal.portlets.SearchPortlet</portlet-class>
<supports>
<mime-type>text/html</mime-type>
<portlet-mode>VIEW</portlet-mode>
</supports>
<resource-bundle>Resource</resource-bundle>
<portlet-info>
<title>SEARCH</title>
</portlet-info>
<portlet-preferences>
<preference>
<name>indexpage</name>
<value>/default/index.html</value>
</preference>
<preference>
<name>setBrowserTitle</name>
<value>false</value>
</preference>
</portlet-preferences>
</portlet>
<filter>
<filter-name>JBoss Portlet Filter</filter-name>
<filter-class>org.jboss.portlet.filter.JBossPortletFilter</filter-class>
<lifecycle>ACTION_PHASE</lifecycle>
<lifecycle>RENDER_PHASE</lifecycle>
</filter>
<filter-mapping>
<filter-name>JBoss Portlet Filter</filter-name>
<portlet-name>SearchPortlet</portlet-name>
</filter-mapping> |
Posted on agosto 12th, 2009 by Alberto Dominguez, PMP
Category: Digital Life, Personal, Tools, Tags: linux, linux migration, ubuntu, windows 7, windows vista
I bought a new desktop computer like a week ago, a nice desktop PC with a beautiful 22″ screen. The truth is that I was looking for an iMac 24″, but unfortunately here in Colombia it could be have an overprice of USD$500 ~ USD$1000. So as you can tell it could be a trip to U.S. with an iMac on your baggage. I talked to some of my friends and coworkers asking for somebody to bring it, but it wasn’t possible this time -at least shortly.
So I bought a nice computer with Windows Vista Home Premium -as usual and some useless stuff like a remote and MediaCenter. I tried it few days and Vista did its magic -slowing down the newest computer even faster than I thought- so I moved to Windows 7 (64 bits version) -Oh Yeah it is like Windows Vista but better (like G.M. TV commercials with their cars).
A week ago, and after doing a realistic evaluation of my computing needs I decided to switch to Ubuntu 9.04 (64 bits version) and mount a VM with Windows XP Home to keep testing on Internet Explorer 6.0. It was a HUGE improvement in performance – I just remembered D.O.S. days when programs run immediately after being called. Ubuntu offers a lot of advantages in compare to Windows, but obviously we are so attached to Microsoft pseudo-world that just thinking on the switch could be a nightmare. I will not debate on architecture, security or speed. I’ll say this as clear as possible. If you do not have to use MS products like Exchange, or you do not have to use speciallized software that runs on Windows -like AutoCAD or Adobe CS4- you can just switch without fair, it will be the reinvention of the computer processing performance.
There are a lot of Linux Distributions in the market -like Ubuntu- but I have to say that Ubuntu is for soft-users and not hard-crazy linux fans. Ubuntu is nice, is really REALLY REALLY easy to install and if you aren’t sure about replacing your desktop with it, you can try Wubi -it installs Ubuntu as a Windows application -WOW!
Just to clarify, I had been using Ubuntu and other linux distributions for a long time (Fedora is another one) but it is the first time I decided to switch to Linux WITHOUT a Windows partition. My wife -who is a dentist- hates its portable due to its response time, and I did all the normal-not-so-risky tasks to speed up its XPS 1210 (that used to be mine) with Windows XP Home Edition, today we had our first class about linux and she is so happy about the speed and performance, and also the virus/crappy-sw situation that isn’t a critical issue on Ubuntu (Linux) so she is thinking seriously about moving to Ubuntu her portable too.
“So, if you’re using Windows and want to ditch it, click here to begin a less stressful life”
IMPORTANT NOTE: I decided to write this post when a friend of mine sent me a link to a post who has the same title of this one. Thanks to Gregory Ferenstein for such inspiring post -I did’t move to Linux because of his post, but I makes me feel like “I’m not alone, I’m not just a crazy guy that hates Microsoft, I’m not a linux fanboy… we are just right about Windows: it sucks!“
Posted on marzo 20th, 2009 by Alberto Dominguez, PMP
Category: Framework, Tools, Tags: project management, software, tool
To choose the right software is not a simple process, and to choose the right project management software is then an even more complicated process and decision. Below you will find few tips and proposed procedure to reduce the risk inherit to this decision.
Tip #1
To choose and implement a PM software tool is not the same of implementing a PM process. Many organizations try to implement a software tool expecting a nonexistent-unnatural process improvement. If you do not have a formal process, or even if your process is not working you have to stop thinking that automation will fix/improve/solve your problems. Automation should be used to reinforce a process and minimize the weaknesses.
Tip #2
Every software implementation process includes at least the following steps -of course every company has its own natural process. Public companies have also additional restriction and evaluation/validation processes that will extend the suggested process:
- Identify needs
- Define selection criteria
- Create a list of options
- Create the request for information
- Evaluate responses
- Reduce the list of options
- Ask for demonstrations or pilot programs
- Choose one
Tip #3
Try to isolate your needs by using the following dimensions to measure the products you are considering:
- Scale – how big the change will be?
- Simple: are you going to organize your projects?
- Personal: are you going to automate estimation and planning on you projects
- Collaborative: are you going to support a team? are you going to share information? do you need to centralize team communications?
- Enterprise: are you affecting the whole company? are you going to bill to your clients using your projects’ data? do you have virtual teams all around the globe?
- Management Paradigm – do you and your team follow a traditional or agile approach to project management?
- Process Maturity – how formal/strong is your process?
- Chaotic: No evidence of documented processes or best practices
- Active: Documented processes carried out, but not formalized
- Efficient: Consistent discipline started
- Responsive: Ubiquitous and measured
- Business driven: Provides data and information to drive business decisions
- Implementation model – are you going to buy the product and support it by yourself? are you going to adopt the SaaS model?
- Budget -
Tip #4
Set your goals – do not expect to do everything better and to include any improvement during the first phase (or the initial implementation cycle). Prioritize to get faster results. Below you will find a list of possible goals that you could address with a PM software tool
- Improve project reporting and tracking
- Improve estimating and scheduling
- Reduce cost or speed process up by automating workflows
- Improve resource assignments
- Improve project communication
- Improve project team collaboration
- Improve overall project process
Every goal will impact different functional areas within an organization. You should plan your implementation to impact those areas and improve those process that will add the most value.
References:
Posted on diciembre 11th, 2008 by Alberto Dominguez, PMP
Category: Personal, Tools, Tags: user experience, wordpress
Amazing transformation for WordPress. Huge UX improvement. Congratulations to the WP Team, you did an amazing job!