Software libre
Otras opciones OSBI: SQLPower Software
Esta empresa ha creado una colección de herramientas open source basadas en java y por lo tanto multiplataforma que responden a las necesidades usuales de un proyecto de inteligencia de negocio. A saber:
- SQL Power Architect (Data Modeling & Profiling Tool): herramienta de modelización de datos que nos permite diseñar el data mart o data warehouse e incluso hacer profiling de los datos cargados.
- SQL Power Loader (ETL Tool): una herramienta de ETL que permite alimentar de datos al data warehouse o data mart.
- SQL Power DQguru (Data Cleansing & MDM Tool): para realizar procesos de limpieza de datos y gestión de datos maestros.
- SQL Power Wabit (The Intuitive BI Reporting Tool): para realizar self-service BI / ad-hoc querys.
- SQL Power Dashboard (Executive Dashboard): para el diseño de scorecard e informes para la alta dirección.
- SQL Power XBRL forms: para enviar y gestionar datos XBRL.
Como podemos ver ofrece aire fresco respecto otras soluciones incluyendo tanto MDM (que por ahora sólo incluye Talend) como XBRL (por primera vez tenido en cuenta en una solución open source). Es decir, buenas ideas desde Canada.
Cabe comentar que algunas de ellas cuentan con una versión de subscripción con características premium.
Fuente: http://www.sqlpower.ca
Agile BI
Existen soluciones que abordan ese problema desde diferentes enfoques:
- Creación de data marts in-memory (pero está claro que no es un data warehouse).
- Desplegar soluciones SaaS enfocadas al self-service BI que frecuentemente tampoco incluyen la construcción del data warehouse sino de pequeños data marts.
- Reducir el tiempo de desarrollo mediante propuestas de desarrollo ágil.
¿En qué consiste su propuesta? En aunar en la herramienta de ETL, las capacidades de crear la capa de metadatos OLAP y la creación de elementos / vistas de análisis. Se persigue, por lo tanto, reducir el tiempo de desarrollo de soluciones analíticas sin menospreciar el desarrollo incremental del data warehouse.
Actualmente se halla en fase de Milestone (y contiene desarrollos no open source), pero debemos tenerlo en cuenta en el futuro dado que es una buena innovación por parte de Pentaho para facilitar el despliegue de soluciones de inteligencia de negocio con sus herramientas.
Fuente: Wiki Pentaho
Intelligence Enterprise destaca Actuate, Jaspersoft, R-Project y Talend como empresas BI a seguir
- Business Intelligence
- Enterprise Applications
- Information Management
Y han sido asesorados por los colaboradores habituales:
- Rajan Chandras, integration expert and author
- Seth Grimes, Alta Plana
- Cindi Howson, BI Scorecard
- David Linthicum, data integration and cloud computing expert
- Curt Monash, Monash Research
- Alan Pelz-Sharpe, CMS Watch
- David Stodder, Perceptive Information Strategies
Vamos a centrarnos en las empresas Open Source:
- Actuate: Actuate es conocida en el ámbito OSBI (Open Source Business Intelligence) por BIRT una de las soluciones de reporting open source más versátiles y potentes del mercado OSBI que anualmente se actualiza siguiendo el roadmap del IDE Eclipse. Esta solución realmente ha revolucionado el nicho de herramientas de Reporting haciendo que las soluciones de otros fabricantes se deban poner las pilas. Vale la pena echar un vistazo al resto de sus productos. Y destacar la comunidad de intercambio de BIRT.
- Jaspersoft: Este empresa conocida por su solución de reporting llamada iReport (una de las primeras soluciones de reporting open source) ofrece una suite completa de BI que integra Reporting, Cuadros de Mando y OLAP. Cabe comentar que Jaspersoft anunció el pasado 23 de febrero que superó los diez millones de descargas, que contribuye a 350 proyectos open source y que tiene una comunidad de 120.000 miembros registrados. Son cifras muy interesantes que refuerzan el mensaje que el Open Source Business Intelligence está viviendo un momento importante. Lo que es cierto es Jaspersoft proclama que es ecosistema BI más grande del mundo y si bien eso se debe coger con pinzas, es importante tener en cuenta que estamos hablando de uno de los actores importantes del sector OSBI.
- R-Project: es una potente solución de análisis estadístico que presenta múltiple módulos especializados. A parte de su uso intensivo en proyectos universitarios, es necesario destacar que es una herramienta de gran solvencia en minería de datos. De ello, se ha percatado incluso otras compañías Business Intelligence como Information Builders que la han integrado en su suite.
- Talend: Talend ofrece soluciones de integración de datos, de MDM (Master Data Management) y Data Quality. Recientemente, ha sido incluida en el Cuadrante Mágico de Gartner de integración de datos como empresa visionaria y eso es un punto a tener en cuenta de esta empresa que está alcanzando cuotas muy importantes en poco tiempo gracias a un trabajo bien hecho.
CDA (Community Data Access)
Este proyecto consiste en crear una capa de acceso basada en llamadas URL de diferentes fuentes de datos: SQL, MDX, Metadatos, Kettle,... e incluso composiciones proporcionando diferentes formatos de salida: JSON, XML, CSV, XLS, HTML.
El beneficio de CDA es crear una capa independiente a ser usada por CDF y CDF-DE u otros proyectos en el futuro.
Si bien aún no está disponible para descarga está previsto que sea integrado directamente en Pentaho.
Esperemos que la comunidad siga participando en esta solución y esto incida también en que la propia empresa también se motive para ofrecer nuevas mejoras y características innovadores como Pentaho Agile BI. Sólo cabe agradecerles su esfuerzo a todos.
Proyecto: http://code.google.com/p/pentaho-cda/
cherokee summit 2010
Hola a todos :
Dentro de poco sera la primera reunión de cherokee y aconsejo a todos que le guste este mundo que se apunte , como no he visto ningún banner para anunciar el evento, y por eso he hecho unos con mi mejor intención
.
Seguridad User-Rol
Una de las cosas que mas se hecha en falta en Pentaho , es el hecho de la seguridad , bueno , hemos desarrollado una librería , mas bien hemos modificado una para que tengáis algo mas de seguridad , pero poco mas es muy básica pero ahí se deja
.
Estamos realizando un bean que contenga esta seguridad . Ya se colgara si alguien quiere participar en el desarrollo pues que lo diga y se le da acceso a la forja , de momento no es publica por temas de concurso y cosas asì pero , cuando se termine todo sera publica. Si alguien tiene alguna duda o queja que ponga un post y si viola el MVC que se le va hacer
/* * Copyright 2006 Pentaho Corporation. All rights reserved. * This software was developed by Pentaho Corporation and is provided under the terms * of the Mozilla Public License, Version 1.1, or any later version. You may not use * this file except in compliance with the license. If you need a copy of the license, * please go to http://www.mozilla.org/MPL/MPL-1.1.txt. The Original Code is the Pentaho * BI Platform. The Initial Developer is Pentaho Corporation. * * Software distributed under the Mozilla Public License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. Please refer to * the license for the specific language governing your rights and limitations. * * @created Jul 12, 2005 * @author James Dixon, Angelo Rodriguez, Steven Barkdull * */ package org.pentaho.platform.web.servlet; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.security.Principal; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.StringTokenizer; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactoryConfigurationError; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.pentaho.platform.api.engine.IAclSolutionFile; import org.pentaho.platform.api.engine.ICacheManager; import org.pentaho.platform.api.engine.IContentGeneratorInfo; import org.pentaho.platform.api.engine.IFileInfo; import org.pentaho.platform.api.engine.IFileInfoGenerator; import org.pentaho.platform.api.engine.IParameterProvider; import org.pentaho.platform.api.engine.IPentahoAclEntry; import org.pentaho.platform.api.engine.IPentahoSession; import org.pentaho.platform.api.engine.IPermissionMask; import org.pentaho.platform.api.engine.IPermissionRecipient; import org.pentaho.platform.api.engine.IPluginSettings; import org.pentaho.platform.api.engine.ISolutionFile; import org.pentaho.platform.api.engine.IUserDetailsRoleListService; import org.pentaho.platform.api.engine.PentahoAccessControlException; import org.pentaho.platform.api.repository.ISolutionRepository; import org.pentaho.platform.engine.core.solution.ActionInfo; import org.pentaho.platform.engine.core.system.PentahoSystem; import org.pentaho.platform.engine.security.SecurityHelper; import org.pentaho.platform.engine.security.SimplePermissionMask; import org.pentaho.platform.engine.security.SimpleRole; import org.pentaho.platform.engine.security.SimpleUser; import org.pentaho.platform.engine.services.WebServiceUtil; import org.pentaho.platform.util.StringUtil; import org.pentaho.platform.util.messages.LocaleHelper; import org.pentaho.platform.util.xml.XmlHelper; import org.pentaho.platform.web.http.request.HttpRequestParameterProvider; import org.pentaho.platform.web.servlet.messages.Messages; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SolutionRepositoryService extends ServletBase { /** * */ private static final long serialVersionUID = -5870073658756939643L; private static final Log logger = LogFactory.getLog(SolutionRepositoryService.class); /** * contains instance of a sax parser factory. Use getSAXParserFactory() method to get a copy of the factory. */ private static final ThreadLocal SAX_FACTORY = new ThreadLocal(); private static final String RESPONSE_DOCUMENT_ENCODING = "UTF-8"; private static final String RESPONSE_DOCUMENT_VERSION_NUM = "1.0"; @Override public Log getLogger() { return SolutionRepositoryService.logger; } public SolutionRepositoryService() { super(); } @Override protected void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException { PentahoSystem.systemEntryPoint(); OutputStream outputStream = response.getOutputStream(); try { boolean wrapWithSoap = "false".equals(request.getParameter("ajax")); //$NON-NLS-1$ //$NON-NLS-2$ String component = request.getParameter("component"); //$NON-NLS-1$ response.setContentType("text/xml"); //$NON-NLS-1$ response.setCharacterEncoding(LocaleHelper.getSystemEncoding()); IPentahoSession userSession = getPentahoSession(request); // send the header of the message to prevent time-outs while we are working response.setHeader("expires", "0"); //$NON-NLS-1$ //$NON-NLS-2$ dispatch(request, response, component, outputStream, userSession, wrapWithSoap); /** * NOTE: PLEASE DO NOT CATCH Exception, since this is the super class of RuntimeException. We do NOT want to catch RuntimeException, only CHECKED * exceptions! */ } catch (SolutionRepositoryServiceException ex) { commonErrorHandler(outputStream, ex); } catch (PentahoAccessControlException ex) { commonErrorHandler(outputStream, ex); } catch (TransformerConfigurationException ex) { commonErrorHandler(outputStream, ex); } catch (ParserConfigurationException ex) { commonErrorHandler(outputStream, ex); } catch (TransformerException ex) { commonErrorHandler(outputStream, ex); } catch (TransformerFactoryConfigurationError ex) { commonErrorHandler(outputStream, ex.getException()); } catch (IOException ex) { // Use debugErrorHandler for ioException debugErrorHandler(outputStream, ex); } finally { PentahoSystem.systemExitPoint(); } if (ServletBase.debug) { debug(Messages.getString("HttpWebService.DEBUG_WEB_SERVICE_END")); //$NON-NLS-1$ } } /** * Used for logging exceptions that happen that aren't necessarily exceptional. It's common that IOExceptions will happen as people begin their transactions * and then abandon their web page by closing their browser or current tab. Logging each one fills up the server log needlessly. Setting to debug level allows * us visibility without compromising a production deployment. * * @param outputStream * @param ex * @throws IOException */ private void debugErrorHandler(final OutputStream outputStream, final Exception ex) throws IOException { String msg = Messages.getErrorString("SolutionRepositoryService.ERROR_0001_ERROR_DURING_SERVICE_REQUEST"); //$NON-NLS-1$; debug(msg, ex); WebServiceUtil.writeString(outputStream, WebServiceUtil.getErrorXml(msg), false); } private void commonErrorHandler(final OutputStream outputStream, final Exception ex) throws IOException { String msg = Messages.getErrorString("SolutionRepositoryService.ERROR_0001_ERROR_DURING_SERVICE_REQUEST"); //$NON-NLS-1$; error(msg, ex); WebServiceUtil.writeString(outputStream, WebServiceUtil.getErrorXml(msg), false); } private static String[] getFilters(final HttpServletRequest request) { String filter = request.getParameter("filter"); //$NON-NLS-1$ List filters = new ArrayList(); if (!StringUtils.isEmpty(filter)) { StringTokenizer st = new StringTokenizer(filter, "*.,"); while (st.hasMoreTokens()) { filters.add(st.nextToken()); } } return filters.toArray(new String[] {}); } protected void dispatch(final HttpServletRequest request, final HttpServletResponse response, final String component, final OutputStream outputStream, final IPentahoSession userSession, final boolean wrapWithSOAP) throws IOException, SolutionRepositoryServiceException, PentahoAccessControlException, ParserConfigurationException, TransformerConfigurationException, TransformerException, TransformerFactoryConfigurationError { IParameterProvider parameterProvider = new HttpRequestParameterProvider(request); if ("getSolutionRepositoryDoc".equals(component)) { //$NON-NLS-1$ String[] filters = SolutionRepositoryService.getFilters(request); Document doc = getSolutionRepositoryDoc(userSession, filters); WebServiceUtil.writeDocument(outputStream, doc, wrapWithSOAP); } else if ("createNewFolder".equals(component)) { //$NON-NLS-1$ String solution = request.getParameter("solution"); //$NON-NLS-1$ String path = request.getParameter("path"); //$NON-NLS-1$ String name = request.getParameter("name"); //$NON-NLS-1$ String desc = request.getParameter("desc"); //$NON-NLS-1$ boolean result = createFolder(userSession, solution, path, name, desc); WebServiceUtil.writeString(outputStream, "" + result + "", wrapWithSOAP); //$NON-NLS-1$ } else if ("delete".equals(component)) { //$NON-NLS-1$ String solution = request.getParameter("solution"); //$NON-NLS-1$ String path = request.getParameter("path"); //$NON-NLS-1$ String name = request.getParameter("name"); //$NON-NLS-1$ boolean result = delete(userSession, solution, path, name); WebServiceUtil.writeString(outputStream, "" + result + "", wrapWithSOAP); //$NON-NLS-1$ } else if ("setAcl".equals(component)) { //$NON-NLS-1$ setAcl(parameterProvider, outputStream, userSession, wrapWithSOAP); } else if ("getAcl".equals(component)) { //$NON-NLS-1$ getAcl(parameterProvider, outputStream, userSession, wrapWithSOAP); } else { throw new RuntimeException(Messages.getErrorString("HttpWebService.UNRECOGNIZED_COMPONENT_REQUEST", component)); //$NON-NLS-1$ } } @Override protected void doPost(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } /** * This method will delete a file from the ISolutionRepository and respects IPentahoAclEntry.PERM_DELETE. * * @param userSession * An IPentahoSession for the user requesting the delete operation * @param solution * The name of the solution, such as 'steel-wheels' * @param path * The path within the solution to the file/folder to be deleted (does not include the file/folder itself) * @param name * The name of the file or folder which will be deleted in the given solution/path * @return Success of the delete operation is returned * @throws IOException */ public static boolean delete(final IPentahoSession userSession, final String solution, final String path, final String name) throws IOException { ISolutionRepository repository = PentahoSystem.get(ISolutionRepository.class, userSession); String fullPath = ActionInfo.buildSolutionPath(solution, path, name); ISolutionFile solutionFile = repository.getFileByPath(fullPath); if (solutionFile != null && repository.hasAccess(solutionFile, IPentahoAclEntry.PERM_DELETE)) { repository.removeSolutionFile(fullPath); return true; } return false; } /** * This method creates a folder along with it's index.xml file. * This method also verifies that the user has PERM_CREATE permissions before * creating the folder. * * @param userSession the current user * @param solution the solution path * @param path the folder path * @param name the name of the new folder * @param desc the description of the new folder * @return true if success * @throws IOException */ public static boolean createFolder(IPentahoSession userSession, String solution, String path, String name, String desc) throws IOException { ISolutionRepository repository = PentahoSystem.get(ISolutionRepository.class, userSession); if (solution == null) { solution = ""; } // verify that the name does not contain a path separator before creating the folder if (name == null || name.indexOf("/") >= 0 || name.indexOf("\\") >= 0 || //$NON-NLS-1$ //$NON-NLS-2$ name.indexOf(ISolutionRepository.SEPARATOR) >= 0) { return false; } String parentFolderPath = ActionInfo.buildSolutionPath(solution, path, "" + ISolutionRepository.SEPARATOR); ISolutionFile parentSolutionFile = repository.getFileByPath(parentFolderPath); if (parentSolutionFile != null && parentSolutionFile.isDirectory() && repository.hasAccess(parentSolutionFile, IPentahoAclEntry.PERM_CREATE)) { File parent = new File(PentahoSystem.getApplicationContext().getSolutionPath(parentFolderPath)); File newFolder = new File(parent, name); if (newFolder.exists()) { // if the new folder already exists, we need to get out return false; } repository.createFolder(newFolder); // create the index file content String defaultIndex = "" + name + "" + (desc!=null?desc:name) //$NON-NLS-1$ + "reporting.pngtruelist"; //$NON-NLS-1$ // add the index file to the repository String indexPath = ActionInfo.buildSolutionPath(solution, path, name); String baseURL = PentahoSystem.getApplicationContext().getSolutionPath(""); repository.addSolutionFile(baseURL, indexPath, ISolutionRepository.INDEX_FILENAME, defaultIndex.getBytes(), false); return true; } return false; } private boolean acceptFilter(String name, String[] filters) { if (filters == null || filters.length == 0) { return true; } for (int i = 0; i < filters.length; i++) { if (name.endsWith(filters[i])) { return true; } } return false; } private boolean accept(boolean isAdministrator, ISolutionRepository repository, ISolutionFile file) { return isAdministrator || repository.hasAccess(file, IPentahoAclEntry.PERM_EXECUTE); } private Element createChild(ISolutionRepository repository, Element parentElement, ISolutionFile childSolutionFile, String name) { Element child = parentElement.getOwnerDocument().createElement("file"); parentElement.appendChild(child); try { String localizedName = repository.getLocalizedFileProperty(childSolutionFile, "name"); child.setAttribute("localized-name", localizedName == null || "".equals(localizedName) ? name : localizedName); } catch (Exception e) { child.setAttribute("localized-name", name); //$NON-NLS-1$ } try { String visible = repository.getLocalizedFileProperty(childSolutionFile, "visible"); child.setAttribute("visible", visible == null || "".equals(visible) ? "false" : visible); } catch (Exception e) { e.printStackTrace(); child.setAttribute("visible", "false"); //$NON-NLS-1$ } String description = repository.getLocalizedFileProperty(childSolutionFile, "description"); child.setAttribute("description", description == null || "".equals(description) ? name : description); child.setAttribute("name", name); //$NON-NLS-1$ child.setAttribute("isDirectory", "true"); //$NON-NLS-1$ child.setAttribute("lastModifiedDate", "" + childSolutionFile.getLastModified()); //$NON-NLS-1$ return child; } private boolean isRoleInList(List roles, String roleName) { boolean found = false; for (int i = 0; i < roles.size() && !found; i++) { found = roles.get(i).equals(roleName); } return bFound; } private void processRepositoryFile(IPentahoSession session, boolean isAdministrator, ISolutionRepository repository, Element parentElement, ISolutionFile parentFile, String[] filters) { ISolutionFile children[] = parentFile.listFiles(); //System.out.println("-->processRepositoryFile"); for (ISolutionFile childSolutionFile : children) { if (!accept(isAdministrator, repository, childSolutionFile)) { // we don't want this file, skip to the next one continue; } String name = childSolutionFile.getFileName(); if (name.startsWith(".")) { // these are hidden files of some type that are never shown // we don't want this file, skip to the next one continue; } if (childSolutionFile.isDirectory()) { // we always process directories // MDD 10/16/2008 Not always.. what about 'system' if (childSolutionFile.getFileName().startsWith("system")) { // skip the system dir, we DO NOT ever want this to hit the client continue; } Principal principal = (Principal) session.getAttribute(SecurityHelper.SESSION_PRINCIPAL); String parentNode = parentElement.getAttribute("localized-name"); String parentNameNode = parentElement.getAttribute("name"); if (parentNameNode.equalsIgnoreCase("users")) { if (childSolutionFile.getFileName().equals(principal.getName())) { Element child = createChild(repository, parentElement, childSolutionFile, name); processRepositoryFile(session, isAdministrator, repository, child, childSolutionFile, filters); } } else if (parentNameNode.equalsIgnoreCase("roles")) { IUserDetailsRoleListService roleListService = PentahoSystem.getUserDetailsRoleListService(); List roles = roleListService.getRolesForUser(principal.getName()); if (isRoleInList(roles, childSolutionFile.getFileName())) { Element child = createChild(repository, parentElement, childSolutionFile, name); processRepositoryFile(session, isAdministrator, repository, child, childSolutionFile, filters); } } else { Element child = createChild(repository, parentElement, childSolutionFile, name); processRepositoryFile(session, isAdministrator, repository, child, childSolutionFile, filters); } // we have finished processing this so skip to the next one continue; } if (acceptFilter(name, filters)) { //$NON-NLS-1$ int lastPoint = name.lastIndexOf('.'); String extension = ""; //$NON-NLS-1$ if (lastPoint != -1) { // ignore anything with no extension extension = name.substring(lastPoint + 1).toLowerCase(); } // xaction and URL support are built in boolean addFile = "xaction".equals(extension) || "url".equals(extension); //$NON-NLS-1$ //$NON-NLS-2$ boolean isPlugin = false; // see if there is a plugin for this file type IPluginSettings pluginSettings = PentahoSystem.get(IPluginSettings.class, session); //$NON-NLS-1$ if (pluginSettings != null) { Set types = pluginSettings.getContentTypes(); isPlugin = types != null && types.contains(extension); addFile |= isPlugin; } Element child = parentElement.getOwnerDocument().createElement("file"); parentElement.appendChild(child); IFileInfo fileInfo = null; if (addFile) { try { // the visibility flag for action-sequences is controlled by /action-sequence/documentation/result-type // and we should no longer be looking at 'visible' because it was never actually used! String visible = "none".equals(repository.getLocalizedFileProperty(childSolutionFile, "documentation/result-type")) ? "false" : "true"; child.setAttribute("visible", visible == null || "".equals(visible) ? "true" : visible); } catch (Exception e) { child.setAttribute("visible", "true"); //$NON-NLS-1$ } if (name.endsWith(".xaction")) { // add special props? // localization.. } else if (name.endsWith(".url")) { // add special props String props = new String(childSolutionFile.getData()); StringTokenizer tokenizer = new StringTokenizer(props, "\n"); while (tokenizer.hasMoreTokens()) { String line = tokenizer.nextToken(); int pos = line.indexOf('='); if (pos > 0) { String propname = line.substring(0, pos); String value = line.substring(pos + 1); if ((value != null) && (value.length() > 0) && (value.charAt(value.length() - 1) == '\r')) { value = value.substring(0, value.length() - 1); } if ("URL".equalsIgnoreCase(propname)) { child.setAttribute("url", value); } } } } else if (isPlugin) { // must be a plugin - make it look like a URL IContentGeneratorInfo info = pluginSettings.getDefaultContentGeneratorInfoForType(extension, session); if (info != null) { IFileInfoGenerator fig = info.getFileInfoGenerator(); if (fig != null) { fig.setLogger(this); // get the file info object for this file fileInfo = fig.getFileInfo(childSolutionFile.getSolution(), childSolutionFile.getSolutionPath(), name, childSolutionFile.getData()); String handlerId = pluginSettings.getContentGeneratorIdForType(extension, session); String fileUrl = pluginSettings.getContentGeneratorUrlForType(extension, session); String solution = childSolutionFile.getSolutionPath(); String path = ""; //$NON-NLS-1$ int pos = solution.indexOf(ISolutionRepository.SEPARATOR); if (pos != -1) { path = solution.substring(pos + 1); solution = solution.substring(0, pos); } String url; if (!fileUrl.equals("")) { //$NON-NLS-1$ url = PentahoSystem.getApplicationContext().getBaseUrl() + fileUrl + "?solution=" + solution + "&path=" + path + "&action=" + name; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } else { url = PentahoSystem.getApplicationContext().getBaseUrl() + "content/" + handlerId + "?solution=" + solution + "&path=" + path + "&action=" + name; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ } child.setAttribute("url", url); //$NON-NLS-1$ } } } } // localization try { String localizedName = null; if (name.endsWith(".url")) { localizedName = repository.getLocalizedFileProperty(childSolutionFile, "url_name"); } else if (fileInfo != null) { localizedName = fileInfo.getTitle(); } else { localizedName = repository.getLocalizedFileProperty(childSolutionFile, "title"); } child.setAttribute("localized-name", localizedName == null || "".equals(localizedName) ? name : localizedName); } catch (Exception e) { child.setAttribute("localized-name", name); //$NON-NLS-1$ } try { // only folders, urls and xactions have descriptions if (name.endsWith(".url")) { String url_description = repository.getLocalizedFileProperty(childSolutionFile, "url_description"); String description = repository.getLocalizedFileProperty(childSolutionFile, "description"); if (url_description == null && description == null) { child.setAttribute("description", name); } else { child.setAttribute("description", url_description == null || "".equals(url_description) ? description : url_description); } } else if (name.endsWith(".xaction")) { String description = repository.getLocalizedFileProperty(childSolutionFile, "description"); child.setAttribute("description", description == null || "".equals(description) ? name : description); } else if (fileInfo != null) { child.setAttribute("description", fileInfo.getDescription()); //$NON-NLS-1$ } else { child.setAttribute("description", name); } } catch (Exception e) { child.setAttribute("description", "xxxxxxx"); //$NON-NLS-1$ } // add permissions for each file/folder child.setAttribute("name", name); //$NON-NLS-1$ child.setAttribute("isDirectory", "" + childSolutionFile.isDirectory()); //$NON-NLS-1$ child.setAttribute("lastModifiedDate", "" + childSolutionFile.getLastModified()); //$NON-NLS-1$ } } } public org.w3c.dom.Document getSolutionRepositoryDoc(IPentahoSession session, String[] filters) throws ParserConfigurationException { ISolutionRepository repository = PentahoSystem.get(ISolutionRepository.class, session); ISolutionFile rootFile = repository.getRootFolder(); org.w3c.dom.Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); org.w3c.dom.Element root = document.createElement("repository"); document.appendChild(root); root.setAttribute("path", rootFile.getFullPath()); boolean isAdministrator = SecurityHelper.isPentahoAdministrator(session); processRepositoryFile(session, isAdministrator, repository, root, rootFile, filters); return document; } private void getAcl(final IParameterProvider parameterProvider, final OutputStream outputStream, final IPentahoSession userSession, final boolean wrapWithSOAP) throws SolutionRepositoryServiceException, IOException { String solution = parameterProvider.getStringParameter("solution", null); //$NON-NLS-1$ String path = parameterProvider.getStringParameter("path", null); //$NON-NLS-1$ String filename = parameterProvider.getStringParameter("filename", null); //$NON-NLS-1$ if (StringUtil.doesPathContainParentPathSegment(solution) || StringUtil.doesPathContainParentPathSegment(path)) { String msg = Messages.getString("AdhocWebService.ERROR_0008_MISSING_OR_INVALID_REPORT_NAME"); //$NON-NLS-1$ throw new SolutionRepositoryServiceException(msg); } ISolutionRepository repository = PentahoSystem.get(ISolutionRepository.class, userSession); String fullPath = ActionInfo.buildSolutionPath(solution, path, filename); ISolutionFile solutionFile = repository.getFileByPath(fullPath); String strXml = null; // ouch, i hate instanceof if (solutionFile instanceof IAclSolutionFile) { Map filePermissions = repository.getPermissions((solutionFile)); String processingInstruction = XmlHelper.createXmlProcessingInstruction(SolutionRepositoryService.RESPONSE_DOCUMENT_VERSION_NUM, SolutionRepositoryService.RESPONSE_DOCUMENT_ENCODING); strXml = processingInstruction + getAclAsXml(filePermissions); } else { strXml = ""; //$NON-NLS-1$ } WebServiceUtil.writeString(outputStream, strXml, false); } // TODO sbarkdull, this method belongs in an AclUtils class? // turn acl into an XML representation, and return the document. // probably belongs in the SecurityHelper class, but does this class still exist? String getAclAsXml(final Map filePermissions) { StringBuffer sb = new StringBuffer(XmlHelper.createXmlProcessingInstruction(SolutionRepositoryService.RESPONSE_DOCUMENT_VERSION_NUM, SolutionRepositoryService.RESPONSE_DOCUMENT_ENCODING)); sb.append(""); for (Map.Entry filePerm : filePermissions.entrySet()) { IPermissionRecipient permRecipient = filePerm.getKey(); if (permRecipient instanceof SimpleRole) { sb.append(""); } else { // entry belongs to a user sb.append(""); } } sb.append(""); return sb.toString(); } Map createAclFromXml(final String strXml) throws ParserConfigurationException, SAXException, IOException { SAXParser parser = SolutionRepositoryService.getSAXParserFactory().newSAXParser(); Map m = new HashMap(); DefaultHandler h = new AclParserHandler(m); String encoding = XmlHelper.getEncoding(strXml); InputStream is = new ByteArrayInputStream(strXml.getBytes(encoding)); parser.parse(is, h); return m; } private class AclParserHandler extends DefaultHandler { Map acl; public AclParserHandler(final Map acl) { this.acl = acl; } @Override public void startElement(final String uri, final String localName, final String qName, final Attributes attributes) throws SAXException { if (qName.equalsIgnoreCase("entry")) { String permissions = attributes.getValue("", "permissions"); IPermissionRecipient permRecipient = null; String user = attributes.getValue("", "user"); if (null != user) { permRecipient = new SimpleUser(user); } else { permRecipient = new SimpleRole(attributes.getValue("", "role")); } this.acl.put(permRecipient, new SimplePermissionMask(Integer.parseInt(permissions))); } } } private void setAcl(final IParameterProvider parameterProvider, final OutputStream outputStream, final IPentahoSession userSession, final boolean wrapWithSOAP) throws SolutionRepositoryServiceException, IOException, PentahoAccessControlException { String solution = parameterProvider.getStringParameter("solution", null); //$NON-NLS-1$ String path = parameterProvider.getStringParameter("path", null); //$NON-NLS-1$ String filename = parameterProvider.getStringParameter("filename", null); //$NON-NLS-1$ String strAclXml = parameterProvider.getStringParameter("aclXml", null); //$NON-NLS-1$ if (StringUtil.doesPathContainParentPathSegment(solution) || StringUtil.doesPathContainParentPathSegment(path)) { String msg = Messages.getString("AdhocWebService.ERROR_0008_MISSING_OR_INVALID_REPORT_NAME"); //$NON-NLS-1$ throw new SolutionRepositoryServiceException(msg); } ISolutionRepository repository = PentahoSystem.get(ISolutionRepository.class, userSession); String fullPath = ActionInfo.buildSolutionPath(solution, path, filename); ISolutionFile solutionFile = repository.getFileByPath(fullPath); // ouch, i hate instanceof if (solutionFile instanceof IAclSolutionFile) { Map acl; try { acl = createAclFromXml(strAclXml); // TODO sbarkdull, fix these really really lame exception msgs } catch (ParserConfigurationException e) { throw new SolutionRepositoryServiceException("ParserConfigurationException", e); } catch (SAXException e) { throw new SolutionRepositoryServiceException("SAXException", e); } catch (IOException e) { throw new SolutionRepositoryServiceException("IOException", e); } repository.setPermissions(solutionFile, acl); } // TODO sbarkdull, what if its not instanceof String msg = WebServiceUtil.getStatusXml(Messages.getString("AdhocWebService.ACL_UPDATE_SUCCESSFUL")); //$NON-NLS-1$ WebServiceUtil.writeString(outputStream, msg, false); } /** * Get a SAX Parser Factory * * NOTE: Need sax parser factory per thread for thread safety. See: http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/parsers/SAXParserFactory.html * * @return */ public static SAXParserFactory getSAXParserFactory() { SAXParserFactory threadLocalSAXParserFactory = SolutionRepositoryService.SAX_FACTORY.get(); if (null == threadLocalSAXParserFactory) { threadLocalSAXParserFactory = SAXParserFactory.newInstance(); SolutionRepositoryService.SAX_FACTORY.set(threadLocalSAXParserFactory); } return threadLocalSAXParserFactory; } }
CDF-DE
De los creadores de CDF (en particular, Pedro Alves), tenemos un nuevo proyecto CDF-DE. Un editor online de cuadros de mando para Pentaho. Si bien se encuentra en una versión muy inicial, este editor se encuentra completamente funcional y eso es un paso significativo en el camino de facilitar la creación tanto para desarrolladores como para usuarios avanzados.
Una vez instalado, desde el servidor de Pentaho es posible la creación si bien es necesario conocer un poco la estructura de un dashboard basado en CDF. Soporta la creación de todos los objetos que actualmente soporta CDF.
Es una buena aportación que conjuntamente con PAT augura un gran futuro de las aportaciones de la comunidad de Pentaho.
Web del proyecto: http://code.google.com/p/cdf-de/Descargar: http://code.google.com/p/cdf-de/downloads/list
MDM para el resto de los mortales
MDM es uno de los puntos calientes del mercado BI y también en el open source se está teniendo en cuenta. Para conocer más sobre la solución de Talend consultad su página.
Le echaremos un vistazo para poder opinar en profundidad.
10 razones para invertir en BI en tiempos de crisis
Cuando pensamos en términos de crisis nos vienen a la cabeza palabras como recorte,reducción de costes,ajustes,etc… Algunas empresas y sus directivos consideran la inversión en Business Intelligence como prescindible cuando el negocio desciendo o hay que recortar gastos. Sin embargo mi opinión es que en estos momentos se hace todavía más necesaria y útil la información que proporcionan los sistemas de BI. Aquí van las diez razones para invertir en BI en tiempos de crisis.
- Las herramientas de BI ayudan de forma fundamental a la toma de decisiones con criterio y en tiempo de crisis las decisiones són mucho más críticas.
- Cuando se trata de recortar gastos el BI ayuda decisivamente a saber QUÉ gastos son más “prescindibles”
- Los proyectos y herramientas de análisis de datos són ( o deberian ser ) proyectos estratégicos a largo plazo pues de ellos depende no sólo el presente sinó el futuro de nuestras decisiones.
- Contrariamente a la idea que tienen todavía algunas empresas sobre los sistemas decisionales, implantar un sistema de BI no requiere ( en general ) una inversión elevada.
- El retorno de la inversión acostumbra a ser elevado si se tienen en cuenta la mejora de la “calidad” de las decisiones.
- Los momentos de crisis también son momentos de reinventarse y de oportunidades. Conocer bien el negocio ayuda a detectar estas nuevas oportunidades.
- La crisis no es para siempre. Hay que ser positivos y pensar en la recuperación. Nada peor que no haber invertido en estos sistemas y no disponer de datos de la “crisis” para analizar a posteriori y aprender para el futuro.
- Tener un buen sistema de inteligencia de negocio permite detectar problemas y procesos críticos de nuestro negocio de forma más rápida y eficiente.Esto nos permitirá ir por delante en la resolución de conflictos.
- Los sistemas de BI proporcionan información agregada,filtrada y segmentada. También presentan información resumida en cuadros de mando muy visuales. Todo esto hace que el tiempo que requerimos para el análisis del estado del negocio sea mucho menor y ganamos tiempo para “actuar”.
Hasta aquí mi aportación!¿ Os animáis a postular vosotr@s la última razón?
PD: Gracias a Ana que me inspirado para la realización de este post






Barcamp e-commerce
Hoy he asisitido como ya anunciaba en este post al Barcamp e-commerce. Una jornada de talleres y conferencias sobre comercio electronico. La verdad es que me ha sorprendido la cantidad de gente que había para la inscripción a primera hora de la mañana (no eran ni las 9h!!).
Los organizadores han montado 3 espacios con talleres simultaneos durante todo el día. Yo he asistido a los siguientes:
¿Qué tecnologias y con que tiendas?
Una exposición de diferentes alternativas para implementar un site de e-commerce. Desde aplicaciones open source para crearla uno mismo hasta solucions SaaS de pago por uso totalmente escalables
a cargo de:
Los mejores canales para conseguir clientes on-line
Una exposición magistral de David Tomas y sobretodo de la didáctica Montse Peñarroya que nos aclaraba todos los elementos a tener en cuenta a la hora de atraer tráfico a nuestro site. Los conocidos conceptos de SEM,SEO,Blogs,etc… Los ponentes que ya he mencionado eran:
- David Tomas – Cyberclick
- Montse Peñarroya – Geaitc
Eshop web 2.0: Comunicar,crear comunidad animar y vender
Como dirigir,moderar y sacar provecho de las redes sociales para nuestro site. El poder de las redes sociales verticales para el e-commerce. Impartido por:
Además hemos compartido una comida improvisada con Alex Puig,Isabel Sabadí y Oriol Llevat.
Las conclusiones es que hay interes en el e-commerce en Barcelona y que la gente se mueve (habría unas 300-400 personas). Estaremos atentos a las nuevas iniciativas que surjan de e-commerce!






Apple presenta el iPad.
Apple ha presentado esta tarde su iPad. Es un tablet pc pero al estilo Apple. Fino,ligero y con muchas funcionalidades. Hay quien dice que está destinado a desbancar el Kindle de amazon como lector de ebooks. Hay quien habla de sus cualidades como lector de prensa on-line. Podriamos hablar de un iPod grande o un iMac pequeño, reune funciones de ambos en un tamaño intermedio.
Por lo que se refiere a temas más técnicos aquí van algunas de sus principales características:
9,7 ” de pantalla
24,2 cm de alto
18,9 cm de largo
1,34 cm de grosor
entre 680y 730 gr. de pes (según modelo)
Hay un modelo con Wi-Fi y otro con Wi-Fi+3G.
Capacidad de 16-32-64 GB
Bateria de hasta 10 horas de duración.
Aunque aún no está disponible en USA (hay que esperar 2 meses) ya está dando mucho que hablar. Los precios van desde los 499$ hasta los 829$.
Aquí tenéis el video del “momento” de esta tarde.
Aquí os dejo la información oficial del iPad en su página de Apple
Increible la locura que se ha vivido en twitter en el momento de la presentación. Lo estaba siguiendo en directo en un site de streaming ( en ese site eramos 95.000 personas) y también en twitterla gente twitteaba a razón de 1000 tweets cada minuto con el topic #ipad realmente espectacular.
Veremos si realmente apple a vuelto a dar en el clavo






Save MySQL
Bueno desde aqui , quiero apollar la iniciativa para ayudar a MySQL.No es mucho pero intentaremos apoyar a esta gran base de datos.
En abril de 2009, Oracle anunció que había acordado la compra de Sun. Como Sun había comprado MySQL el año anterior, esto significaría que Oracle, empresa líder en el mercado para bases de datos de código cerrado, también sería el propietario de MySQL, la base de datos de código abierto más popular.
Si Oracle comprara MySQL basado en lo anterior, tendría un control sobre MySQL equivalente a cualquier cantidad de dinero que podría comprar un proyecto de código abierto. De hecho, para la mayoría de proyectos de código abierto (como Linux o Apache), no hay ninguna forma comparable en la que un competidor pudiera comprar incluso un décimo de esa influencia. Pero el éxito de MySQL siempre ha dependido de la compañía que está detrás y que se encarga de desarrollar, vender y promoverlo. Esa compañía (inicialmente MySQL AB, después Sun) siempre ha sido la propietaria de los importantes derechos de propiedad intelectual (IPR, por sus siglas en inglés), especialmente la marca registrada, los derechos de autor y, hasta el momento sólo con propósitos defensivos, las patentes. Ha utilizado los derechos de propiedad intelectual para generar ingresos y ha reinvertido gran parte de esos ingresos en desarrollo, no sólo creciendo sino también mejorando con el tiempo.
Si esos derechos de propiedad intelectual caen en manos de la competencia principal de MySQL, entonces MySQL inmediatamente deja de ser una alternativa frente a los propios productos costosos de Oracle. Hasta el momento, los clientes podían escoger entre utilizar MySQL en los nuevos proyectos en vez de los productos de Oracle. Algunas grandes compañías incluso migraron de Oracle a MySQL para las soluciones de software existentes. Y cualquiera podía con certeza amenazar a los vendedores de Oracle con utilizar MySQL a menos que se otorgara un descuento importante. Si Oracle es la propietaria de MySQL, se reirá cuando los clientes intenten hacer esto. Deshacerse de este problema le vale a Oracle, al menos, mil millones de dólares al año, si no más.
Di no al BI
Bueno como siempre creo que es mejor reir que llorar ahi va un vdeo que me recuerda mi antigua empresa.
Dedicado a @pepeblog y a @skiterskiterio skitero y a super @dagi3d

Nuevo Libro: Jasper Reports 3.5 for Java Developers
El libro está muy orientado a desarrolladores que quieran usar las librerias de Jasper Reports para sus aplicaciones y explica con todo detalle como generar,compilar y renderizar los reports con sus librerías.
Es un libro emintemente técnico pero también apto para aquellos diseñadores de reports que deseen ampliar sus conocimientos de la herramienta.
Os dejo un link al capítulo de muestra que habla sobre creación de graficos usando el generador de informes iReport.

Analisis Predictivos
Que es el analisis predictivo , es la otra manera de decir Mineria de Datos , muchos dicen que es que es proximo paso para el analisis de datos. Pero hay muchos problemas por que dentro de la mineria de datos,es que nadie sabe que es y para que sirve y por eso no lo piden o cuando lo piden lo que piden es un imposible.
Muchas de las herramientas open source lo que pretenden es crear un modelo y luego en el flujo de infromacion pasar los datos por ese modelo y genrar otro modelo paralelo.
Kettle o PDI lo no biene de serie con el plugin de mineria de datos que en el caso de son:
- Sacar ficheros en formato arff
- WekaScoring : Con este plugin sacamos un modelo con weka y luego lo que hacemos , es pasar el flujo de informacion por ese modelo.
Dentro de poco hare un video de como actualizar el kettle para poder poner kettle en este caso el mas importante es el numero 2.
Lo principal dentro del analisis predictivo son los siguientes
Análisis de Cesta de Mercado Descubra qué objetos tienden a ser comprados juntos para crear recomendaciones en la marcha y para determinar cómo el posicionamiento del producto puede contribuir directamente a su línea inferior. Análisis Churn Anticipe a los clientes que puedan estar considerando cancelar su servicio e identificar los beneficios que podrían retenerlos. Análisis de mercado Defina los segmentos de mercado agrupando clientes similares automáticamente. Utilice este análisis para buscar clientes rentables. Proyecciones (Forecasting) Pronostique ventas y montos de inventario y aprenda cómo están relacionados entre sí. para prever cuellos de botella y mejorar el rendimiento. Exploración de Información Analice la rentabilidad a través de los clientes o compare clientes que prefieren diferentes marcas del mismo producto, para descubrir nuevas oportunidades.Análisis de Cesta de Mercado
Descubra qué objetos tienden a ser comprados juntos para crear recomendaciones en la marcha y para determinar cómo el posicionamiento del producto puede contribuir directamente a su línea inferior.
Análisis Churn
Anticipe a los clientes que puedan estar considerando cancelar su servicio e identificar los beneficios que podrían retenerlos.
Análisis de mercado
Defina los segmentos de mercado agrupando clientes similares automáticamente. Utilice este análisis para buscar clientes rentables.
Proyecciones (Forecasting)
Pronostique ventas y montos de inventario y aprenda cómo están relacionados entre sí. para prever cuellos de botella y mejorar el rendimiento.
Exploración de Información
Analice la rentabilidad a través de los clientes o compare clientes que prefieren diferentes marcas del mismo producto, para descubrir nuevas oportunidades.Pero, ¿qué pasa cuando el número de variables por analizar es por docenas o incluso cientos? Se vuelve más difícil el encontrar una buena hipótesis, analizar la base de datos con OLAP, verificarla o desaprobarla.
La minería de datos es diferente de OLAP porque en lugar de verificar patrones hipotéticos, usa los mismos datos para descubrir tales patrones. Es en esencia un proceso inductivo.Minería de datos exitosa.
Hay dos llaves para tener éxito con la minería de datos. La primera es llegar a un modelo preciso del problema que se está tratando de resolver. Posteriormente analizaremos conceptos como Clustering y Análisis de Relaciones. La segunda es interpretar y usar los datos. Conoceremos varios algoritmos como las Redes Neuronales, Árboles De Decisión, Inducción De Reglas, K-Vecino Cercano, Regresión Logística, Análisis de Discriminantes y Algoritmos Genético.
aqui dejo un video de Mineria de Datos
Novedades en Weka 3.7.1
Empezamos por Weka. Este producto, como ya sabemos, fue adquirido por Pentaho si bien aún se mantiene como producto independiente. En la última versión (disponible aquí), podemos encontrar interesantes mejoras con la inclusión de nuevos algoritmos entre los que destacamos:
- SPegasus: Es un algoritmo que a través de la descendiente del gradiente estocástico, permite aprendizaje de support vector machine. Para más información consultad el artículo: S. Shalev-Shwartz, Y. Singer, N. Srebro: Pegasos: Primal Estimated sub-GrAdient SOlver for SVM. In: 24th International Conference on MachineLearning, 807-814, 2007.
- RealAdaBoost: algoritmo de clasificación de Friedman que usa el método Real Adaboost. Para más información: J. Friedman, T. Hastie, R. Tibshirani (2000). Additive Logistic Regression: a Statistical View of Boosting. Annals of Statistics. 95(2):337-407.
- Furia (Fuzzy Unordered Rule Induction Algorithm): aprendizaje de reglas fuzzy basado en el algoritmo RIPPER. Para más información: Jens Christian Huehn, Eyke Huellermeier (2009). FURIA: An Algorithm for Unordered Fuzzy Rule Induction. Data Mining and Knowledge Discovery.
Son buenas noticias que este tipo de productos continúe mejorando año tras año.
Brand community management: nueva profesión para una nueva era
El mundo de internet y las redes sociales está revolucionando el marketing y la relación entre empresa y cliente. Para moderar todo este cambio y para ser la voz de la empresa en las redes sociales se está afianzando la figura del Brand community manager. La figura del BCM está a caballo entre el marketing, la tecnologia y la comunicación. Su misión es representar una marca y moderar la comunidad que se genere a su alrededor. Se trata de que la comunicación entre empresa y comunidad sea mucho más que bidireccional. La empresa ( o la marca) puede beneficiarse de las redes sociales escuchando a sus usuario y comunicándose con él.
Estoy convencido de que vamos a oir hablar mucho de Brand Community Management durante este 2010 que acaba de empezar.
Este post viene inspirado por el evento al que he asistido esta tarde sobre BCM en la Salle URL de Barcelona. La gente de la Salle URL han creado el primer postgrado de BCM y han organizado este evento para presentarlo. El evento ha sido muy interesante y hemos podido escuchar 3 expertos del sector que actualmente ya trabajan como BCM desde diferentes puntos de vista.
Pentaho Community Technical WebEx
Para este 2010, continúan con este tipo de eventos y ya tenemos las fechas y contenidos de las dos primeras:
- January 13, 2010 - Roland Bouman - OLAP and Analysis for web applications using XMLA: en la que se presentará el framework javascript Xmla4Js que permite interactuar con orígenes de datos XMLA.
- January 20, 2010 - Nick Goodman - LucidDB, DynamoBI and Mondrian: dónde se presentará las bondades de la base de datos en columnas LucidBD en el contexto de Pentaho.
Como acaba el año el BI open source
"Open Source Solutions: Managing, Analyzing and Delivering Business Information"
a mi modo de ver nos presenta un buen resumen de como acaba el año por lo que al Business Intelligence open source se refiere.
La noticia más importante bajo mi punto de vista es que las empresas están usando (un 14% en producción y un 8% en pilotos o proyectos internos) BI open source y muchas lo están evaluando ( un 22% concretamente) así pues podemos decir que un 44% de las empresas están pensando y valorando usar software open source para sus soluciones de BI y eso es sin duda una gran noticia
Por otro lado a nivel de fabricantes de software el ranking queda como sigue:
1. Pentaho (47%)
2. JasperSoft(28%)
3. Mondrian (26%)
4. Eclipse BIRT (19%)
Seguidos de lejos por otras soluciones como JFree Report,Spago BI y OpenI
Teniendo en cuenta que Mondrian forma parte de la suite Pentaho (aunque pueda usarse de forma independiente),es evidente que Pentaho lleva una gran ventaja a sus competidores con una cuota de mercado del 73%.
Sin embargo al software open source de BI le quedan asignaturas pendientes.Valga como ejemplo el poco uso que se hace de las funcionalidades que bajo mi punto de vista son propias del BI, pues sólo el 31% de los usuarios usan las herramientas para análisis OLAP o cuadros de mando y el 69% lo utiliza para algún tipo de reporting.
Otro ejemplo del camino que queda por recorrer es la complejidad técnica del producto open source: Un 41% de los clientes encontraron dificultades técnicas de instalación y configuración y un 32% de rendimiento y de inestabilidad del sistema.
Como digo las expectativas para este 2010 parece que son buenas pues se despierta un gran interés por el OSBI sin embargo los fabricantes deben también ponerse las pilas y mejorar para salvar esas dificultades y barreras que encuentran los usuarios en su utilización.
Podéis descargar el estudio en la siguiente página :
http://www.beyeresearch.com/study/12261
Mi Vision de la crisis
Desde que empezó la crisis , nos han contado que las empresas de IT serian las que mantendrían el mercado , pero poco a poco las cosas se han ido cayendo como piezas de domino voy a intentar explicar a que me refiero primero con el Re-search and development y después la informática
Primero España a liderado el recortar el I+D+i o mas bien el I-D-i.
El Gobierno baraja una reducción del 37% hasta caer a los niveles de 2006
Lo mejor es que las revistas y inversión prestigiosas no hacen mas que decir que esa no es la solución.
“No es una forma sabia de responder a la crisis financiera”
Donde queda este país si se quita en el i+d pero le dan dinero a escuela de cocina que han abierto en la comunidad vasca y la ministra cuenta que la comida es también i+d pero la cura para el cáncer no .
Pero que mas da las IT son la solución para la crisis . El sueldo medio de un ingeniero es España es de 1700€/mes que es de risa en comparación con Europa.
Ingreso promedio mensual de las 10 carreras universitarias de mayores ingresos ($ de 2004, al quinto año de titulación)
Geología: 1.773.145 *
Ingeniería Civil en Minas: 1.622.561
Ingeniería Eléctrica: 1.501.801
Ingeniería Civil Industrial y menciones 1.473.220
Ingeniería Electrónica 1.458.541
Ingeniería Civil: 1.403.916
Medicina: 1.348.324
Ingeniería en Información y Control de Gestión: 1.340.527
Ingeniería Civil en Computación: 1.319.780
Derecho: 1.285.196
Ingeniería (e) Informática: $906.398
Contador Auditor: $853.130
Ingeniería (e) en Administración de Empresas e Ingeniería (e) en Mecánica: $700.000
Diseño Gráfico: $ 600.000
Pero donde entra la informática , en la lucha de las grandes de la informática consultorías o mas bien cárnicas como todo el mundo las conoce, para poder llevarse los grandes premios del desarrollo en España y Europa . Han encontrado un método raro a la hora de conseguir proyectos y es competir en precio mientras que no en calidad ,como es posible esto ,pues muy sencillo haciendo lo que mejor sabe machacar a la gente de abajo pagando sueldos miserables y presionando a la gente para que hagan de todo desde café con leche , hasta cambiar la tinta de la impresora.
El problema principalmente en la informática , es que no se ve como algo importante , es decir , no se nos ve como ingenieros , se nos ve como el tío que me arregla la impresora , o esa panda de gente parecida a IT CROW .
Lo principal es que se nos valore ,se nos respete ,ahí entra el tema de la titulitis y/ o el colegio de informáticos.
Por que no tener un colegio de informática por que tanta reticencia , no se , puede que sea malo o no ,pero también tiene buenos aspectos , como poder luchar por cosas de manera colectiva , y que alguien luche por nuestros derechos .Si todo el mundo conoce o sabe o le ha contado la mafia que es , lo que se ha de pagar y tal ,pero a los industriales o teleco o aeronáuticos les va bien y son un colectivo fuerte.
Un estudio llevado a cabo por el Dr. Simone Santini del Departamento de Ingeniería Informática de la Universidad Autónoma de Madrid, publicado en la revista Computer, desvela que la Informática como disciplina científica está sufriendo una profunda crisis debido al éxito industrial que está experimentando.
Según la fotografía económica del INE, es más fácil encontrar trabajo en empresas relacionadas con las tecnologías de la información. Aunque el empleo se ha reducido un 2,4% en el conjunto del sector servicios respecto a octubre de 2007, en este segmento en particular ha aumentado un 1,2% frente a las caídas experimentadas en servicios a empresas (-4%), turismo (-3,4%) y comercio y transporte (-1,8% en ambos casos).
La cifra de negocios del sector ‘Tecnologías de la Información’ aumentó en octubre un 0,5% respecto a septiembre y un 1,9% frente al mismo mes de 2007. Sin embargo, ‘Comercio’ (-10,2% y -1,7%, respectivamente), ‘Turismo’ (-8,3% y -1,4%), ‘Transporte’ (-5,3% mensual aunque un 1% interanual) y ‘Servicios a Empresa (-4,1% y 1,4%) sufrieron en octubre el enfriamiento de la actividad económica.
Para concluir una frase celebre que me encanta :
“Estamos manejando dinero público, y el dinero público no es de nadie”.
* http://www.universia.cl/html_estatico/portada/actualidad/noticia_actualidad/param/noticia/ifedc.html





