El Negocio de la Innovación

La aplicación de una 'ruta óptima' cuyo valor es reconocido por el mercado

Ayer asistí a una conferencia organizada por la Asociación de Egresados y Graduados de la PUCP a la que le dieron el nombre de El Negocio de la Innovación. Los expositores fueron el Mag. Eduardo Ismodes Cascón, mi buen ex decano, y Mag. Fernando Villarán De La Puente.

La temática la describieron así:

La importancia de la innovación desde sus diferentes aspectos centrándolo en su práctica en las PYMEs. Asimismo nos conversarán sobre detalles y pormenores a tomar en cuenta para ser innovadores.

Rescato algunos datos sueltos y comentarios algo más complejos.

Observación: Estoy empezando a leer dos textos (GEM 2009 Executive Report y GEM Special Report on Edutaction and Training) en los que en la primera vista rápida ya he detectado términos más precisos y/o técnicos para palabras que emplearon expositores. Seguramente el lenguaje de la conferencia consideró un público general más que profundamente adentrado en el tema de emprendimiento o su referencia bibliográfica vigente.

El Inventor crea. Luego de ese punto se debe pasar a la venta para llegar a la definición de Innovador. El Innovador entonces parte de una necesidad real del mercado o de la presunción de tal necesidad para esforzarse en crear el producto o servicio que la satisfaga. Entra también a jugar el rol del Vendedor de una Invención de un tercero.

La Innovación surge de abajo. No son los laboratorios con sus favorables condiciones los centros desde los que se produce la innovación. Aunque sí, suelen adoptarla en cierto punto y desarrollarla para los mercados.

El análisis lleva a establecer que es diferente la innovación por necesidad y la innovación por vocación. Y esto se refleja en agrupaciones macro como países subdesarrollados, en vías de desarrollo y desarrollados [De acuerdo al GEM 2009 Global Report, la clasificación es de Economías: Factor-Driven, Efficiency-Driven e Innovation-Driven]. Es diferente innovar por necesidad. Considero que localmente sentimos algo extraño porque las reuniones de innovadores parecen tener al menos dos lenguajes distintos. Y es que los equipos reúnen a los innovadores tal vez con estos diferentes móviles. Mucho cuidado.

La experiencia laboral es muy importante para conocer cómo se hacen las cosas, qué atajos podemos tomar, cómo podemos realizar los procesos de manera más eficientes. Esto es minimizar riesgos, establecer el ruta óptima hacia el objetivo.

Las soluciones de mayor complejidad son las que generan mayor valor.

La métrica basada en la generación de nuevos negocios considera la creación y el cierre de empresas. Consecuentemente, se puede establecer un tiempo promedio de vida de las empresas que existen en un período de tiempo, agruparlas de acuerdo a rangos de tiempo de vida y realizar proyecciones.

La inversión en Investigación y Desarrollo es muy segura y rentable. Las inversiones de esta naturaleza al lograr una madurez de 6 años han producido el equivalente a 30% anual.

Si la inversión va a 10 innovaciones, 7 u 8 no triunfarán, pero el éxito de las otras 2 genera un retorno que cubre y genera un margen de ganacias superior a la inversión total.

Algunas claves para la innovación son:
– Experiencia laboral
– Modelo de innovador (Ford, Beneton, Gates, Zuckerberg)
– Red de Contactos
– Plan de Negocios

Quiero agregar a esto que actualmente los emprendimientos ágiles consideran un producto minimo viable para sondear realmente el mercado. El Plan de Negocios puede plantearse a partir de las observaciones del mencionado ejercicio.

¿Te animas a compartir…
alguna conferencia (tal vez online) de este tipo?
algún material (bibliografía) para revisar?
tu experiencia en innovación?

Nos vemos.

Cupcakes

post por encargo de y dedicado a @maru_barbosa

Cupcakes… si algo con cakes está en mi mente es el CakePHP

CakePHP

O tal vez ese episodio de Two and a Half Men en el que Jake conversa con su tío Charlie acerca de Cupcakes. Jake relaciona el amor con los cupcakes, Charlie piensa en principio que Jake está expresándose con una metáfora pero luego cae en razón de que realmente lo que él ama son los cupcakes.

Two and a Half Men - Cupcakes

Y este geek no podría sino encontrar gracia en la disposición de cupcakes para obtener a Super Mario:

Super Mario Cupcake

Y hasta donde me acuerdo, Maru, nos encontramos en el face…

facebook cupcake

No hace mucho nos followeamos en el twi..

twitter cupcake

Entonces de ninguna manera no nos caería pesado otro poquito de compu e inter… dale:

social media & geek cupcakes

Y con buena vibra podrías gozar de unos ricos reggae cupcakes, verdad?

reggae cupcakes

Y también se puede salir, al cine, por ejemplo. Querés pop-corn?

popcorn cupcakes

Nada, entonces te llamo más tarde. No apagues el iPhone:

iPhone cupcakes

Ya sé, ya sé… no lo apagas pero al parecer te quedás reenganchada con el pacman ese… maldito google y los 30 años del pacman:

pacman cupcakes

Pero entonces qué? Te quedás dormida luego de contar… ovejitas???

ovejita cupcake

Sabes María Eugenia, lo que es yo me voy a ver MI mundial. Pendiente aquí de vos y todos en todos los países pendientes del mundial

banderitas cupcakes

Eeeeiiii… hay hamburguesas… bajaaaá, despertaaaá

hambuerguesas cupcakes

Nada… contigo no se puede… me voy tras otra que si gustá del cupcake… la gatita le dicen…

gatita cupcake

– ei, gata! querés tu cupcake?

ei, gata! querés tu cupcake?

– sí papi, me lo como todo.

sí papi, me lo como todo.

Así termina esta historia de pasión, engaño, traición, amor, jueguitos, internet y mundial… un poquito porno también. final fatal

cupcakes cuchillados

… en pelotas

cupcakes pelotas

no continuará.

Un rápido y sencillo CRUD desde Drupal con Auto Admin

Drupal Perú

Este proyecto para fines didácticos lo llamaremos DrupCrud, una aplicación del tipo CRUD (create, read, update and delete) dentro de nuestro Drupal.

Es prequisito ya tener instalado y más o menos conocido a nuestros monstrito Drupal.

Obtenemos drush:

wget http://ftp.drupal.org/files/projects/drush-All-versions-3.0.tar.gz
gunzip -c drush-All-versions-3.0.tar.gz | tar xopf -

Podemos crear un alias para acceder cómodamente a drush, para lograrlo agregamos la siguiente línea:

alias drush='<RUTA DE DRUSH>/drush'

al archivo ~/.bashrc

nano ~/.bashrc

Desde la terminal nos ubicamos en el directorio donde hemos instalado drupal:

cd /var/www/<DIRECTORIO DRUPAL>

Necitamos de los módulos Schema y Auto Admin.

Schema

Introduced in Drupal 6, the Schema API allows modules to declare their database tables in a structured array (similar to the Form API) and provides API functions for creating, dropping, and changing tables, columns, keys, and indexes.

The Schema module provides additional Schema-related functionality not provided by the core Schema API that is useful for module developers. Currently, this includes:

* Schema documentation: hyperlinked display of the schema’s embedded documentation explaining what each table and field is for.
* Schema structure generation: the module examines the live database and creates Schema API data structures for all tables that match the live database.
* Schema comparison: the module compares the live database structure with the schema structure declared by all enabled modules, reporting on any missing or incorrect tables.

Note for MySQL users: The Schema module requires MySQL 5. Prior versions of MySQL do not support the INFORMATION_SCHEMA database that the Schema module uses to inspect the database.

Auto Admin

Auto Admin is a module targeted at developers that generates administration pages for database tables automatically. Using its drush commands it is possible to create list, add, edit and delete pages for multiple tables in a matter of minutes. One-to-many and many-to-one relationships are supported.

Auto Admin is good at managing data for custom modules whose data structure does not fit as node types. It lets you get of the ground and writing «the fun stuff» really, really quick.

Le solicitamos a drush que descargue y ubique adecuadamente los módulos Schema y Auto Admin. Podemos colocar el parámetro -d para mostrar aún más información incluyendo los mensajes internos.

drush -d dl schema autoadmin

Y los habilitamos:

drush pm-enable schema autoadmin

Ahora creamos las tablas que necesitemos. En este punto el tutorial se vuelve más específico para ser más sencillo de entender. Trabajaremos con un caso de ejemplo: Una aplicación CRUD para un directorio de bandas cada una identificada con un país.

CREATE TABLE `bands` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL,
  `country_id` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `country_id` (`country_id`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE `countries` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(24) COLLATE utf8_unicode_ci DEFAULT NULL,
  `band_count` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Y creamos el módulo bands, basta con crear un par de archivos en la ruta

/var/www/<RUTA DE DRUPAL>/sites/all/modules/bands

bands.module

<?php
// $Id$
/**
 * @file
 * Module for managing of bands information.
 * This module provides basic managing for band information
 */

bands.info

;$Id$
name = "Bands"
description = "Displays infomration about bands"
core = 6.x
php = 5.3

Buena parte del trabajo lo dejamos en las manos de Dios… digo, de drush. Pero no podrá ser posible sin antes arreglar un problema de incompatibilidad entre la actual versión de drush y auto admin. Creamos un archivo de configuración para drush:

cp <RUTA DE DRUSH>/examples/example.drushrc.php /var/www/<RUTA DE DRUPAL>/sites/default/drushrc.php

En el archivo drushrc.php, descomentamos la siguiente línea:

# $options['allow-spaces-in-commands'] = 1;

Nos queda como tarea actualizar el código de Auto Admin porque:

// DEPRECATED: Allow command names to contain spaces.
// This feature will be removed shortly; drush-3 will
// require commands to be named with dashes instead of
// spaces (e.g. «cache-clear» instead of «cache clear»).
// During the transition period, uncomment the line below
// to allow commands with spaces to be used.

Felices de la vida, que drush realice el trabajo sucio:

drush autoadmin generate bands bands countries --write

Se habrán creado dos archivos:

bands.autoadmin.inc: Agregamos las relaciones necesarias (‘relations’).

<?php
// $Id

/**
 * @file
 * Auto Admin schemas for bands module.
 *
 * @tables {bands}, {countries}
 */

/**
 * Implementation of hook_autoadmin_schema().
 */
function bands_autoadmin_schema() {
  // Auto Admin schema for {bands} table
  $autoadmin_schema['bands'] = array(
    'alias' => 'name',
    'inline_filter' => FALSE,
    'path' => 'admin/content/bands',
    'title' => t('Bands'),
    'title_plural' => t('Bands'),
    'fields' => array(
      'id' => array(
        'autoadmin_type' => 'primary_key',
        'title' => t('Id'),
        'title_plural' => t('Ids'),
      ),
      'name' => array(
        'autoadmin_type' => 'varchar',
        'title' => t('Name'),
        'title_plural' => t('Names'),
      ),
      'country_id' => array(
        'autoadmin_type' => 'int',
        'title' => t('Country'),
        'title_plural' => t('Countries'),
      ),
    ),
    'relations' => array(
      'countries' => array(
        'type' => 'has_one',
        'local_key' => 'country_id',
        'foreign_key' => 'id',
      ),
    ),
  );

  // Auto Admin schema for {countries} table
  $autoadmin_schema['countries'] = array(
    'alias' => 'name',
    'inline_filter' => FALSE,
    'path' => 'admin/content/countries',
    'title' => t('Countries'),
    'title_plural' => t('Countries'),
    'fields' => array(
      'id' => array(
        'autoadmin_type' => 'primary_key',
        'title' => t('Id'),
        'title_plural' => t('Ids'),
      ),
      'name' => array(
        'autoadmin_type' => 'varchar',
        'title' => t('Name'),
        'title_plural' => t('Names'),
      ),
      'band_count' => array(
        'autoadmin_type' => 'int',
        'title' => t('Band Count'),
        'title_plural' => t('Band Counts'),
      ),
    ),
    'relations' => array(
      'bands' => array(
        'type' => 'has_many',
        'local_key' => 'id',
        'foreign_key' => 'country_id',
      ),
    ),
  );

  return $autoadmin_schema;
}

bands.install: Podemos establecer las descripciones de tablas y campos.

<?php
// $Id

/**
 * @file
 * Install file for bands module.
 *
 * @tables {bands}, {countries}
 */

/**
 * Implementation of hook_install().
 */
function bands_install() {
  // Create tables.
  drupal_install_schema('bands');
}

/**
 * Implementation of hook_uninstall().
 */
function bands_uninstall() {
  // Remove tables.
  drupal_uninstall_schema('bands');
  menu_rebuild();
}

/**
 * Implementation of hook__schema().
 */
function bands_schema() {
  // Database schema for {bands} table.
  $schema['bands'] = array(
    'description' => t('Directory of bands'),
    'fields' => array(
      'id' => array(
        'description' => t('TODO: please describe this field!'),
        'type' => 'serial',
        'unsigned' => TRUE,
        'not null' => TRUE,
      ),
      'name' => array(
        'description' => t('Name of the band'),
        'type' => 'varchar',
        'length' => '64',
        'not null' => FALSE,
      ),
      'country_id' => array(
        'description' => t('TODO: please describe this field!'),
        'type' => 'int',
        'unsigned' => TRUE,
        'not null' => FALSE,
      ),
    ),
    'primary key' => array('id'),
    'indexes' => array(
      'country_id' => array('country_id'),
    ),
  );
  
  // Database schema for {countries} table.
  $schema['countries'] = array(
    'description' => t('List of countries'),
    'fields' => array(
      'id' => array(
        'description' => t('TODO: please describe this field!'),
        'type' => 'serial',
        'unsigned' => TRUE,
        'not null' => TRUE,
      ),
      'name' => array(
        'description' => t('Name of the country'),
        'type' => 'varchar',
        'length' => '24',
        'not null' => FALSE,
      ),
      'band_count' => array(
        'description' => t('TODO: please describe this field!'),
        'type' => 'int',
        'unsigned' => TRUE,
        'not null' => FALSE,
      ),
    ),
    'primary key' => array('id'),
  );
  
  return $schema;
}

Habilitamos el módulo:

drush pm-enable bands

Listo. Vemos cómo quedó:

Lista de países:

CRUD on Drupal with Auto Admin

Lista de bandas, observar que se muestra el nombre del país al que pertence:

CRUD on Drupal with Auto Admin

Vista de ingreso de nuevas bandas:

CRUD on Drupal with Auto Admin

El país al que pertenecen las bandas se puede seleccionar de un combobox con las opciones descriptivas:

CRUD on Drupal with Auto Admin

Observaciones:

  • Los IDs son los elementos que realizan el enlace pero no son adecuados para las interfaces por lo que se emplean los nombres o descripciones en texto.
  • Tengo entendido que cosas mucho más avanzadas se pueden hacer utilizando CCK, Views. O con una herramienta y módulos específicos para el mapeo de tablas de base de datos como Doctrine.

Agradecimientos especiales a Rune Kaagaard (_rune), creador de Auto Admin.