domingo, 24 de enero de 2016

Mas recursos por favor!!!

En mis tempranos días de Universidad, cuando el turbo pascal pagaba mis cuentas, recuerdo una tarde en que programaba, mejor dicho, tiraba unas líneas de código para una encomienda que mi hicieron, y me di cuenta que la pantalla, mi diseño, se pintaba muy lento…. Corrían los días del fiel DOS y sus pantallas de 80 x 25 en modo carácter. La inquietud me vino, porque tenía instalado un programa de Norton, no recuerdo cual era, y en este último las pantallas volaban, superponían ventanas y se pintaban en un dos por tres!!!

Yo me dije, Carambolas Blas! ¿Que ocurre aquí? Repámpanos, que el diablo me lleve, y toda esa suerte de frases rebuscadas que usan en los comics para no decir groserías!!! Jajajajaja. El caso es que me dije, ¿cómo es esto posible? ¿Qué estoy haciendo mal?

Yo pintaba mis pantallas con una rutina….. si, si, era muy inocente. Y se podía ver como se dibujaba cada línea de caracteres por el monitor, una tras otra…. Lentoooooo….

Las de Norton aparecían casi al instante!!!  QUE ENVIDIA!!!

Me puse a pensar entonces, si, a veces lo hago, y me dije que todo esto que se ve son ceros y unos, que deben estar almacenados en algún lugar de la memoria del computador, lo que ahora llamaré Memoria de Vídeo. Imaginé que si podía diseñar mis pantallas y almacenarlas a disco, y luego cuando las necesitara cargarlas a una memoria cache y, en su momento, mover todos esos bytes directamente a la Memoria de Video, seguramente mis pantallas parecerían ser tan rápidas como las que veía en otros sistemas comerciales.

Java vs .Net vs PHP, la pelea equivocada

Java vs .Net vs PHP, la pelea equivocada

Es frecuente leer, en el ámbito del Internet, las no pocas querellas que se arman entre los defensores de las más populares tecnologías de desarrollo de software en el mercado actual.

Yo mismo he promovido tales encuentros y le he echado leña  al fuego con mis actitudes y humores en preferencia de una tecnología u otra.

Fuera de lo divertido e interesante que es aprender de los diversos argumentos que se presentan y de los no poco apasionados razonamientos que se efectúan, que suelen derivar en “Troleadas” intensas, me llama la atención dentro de toda esta alharaca tecnológica un hecho bien particular que he notado a lo largo de mis años como consultor.

Estoy hablando de un participante mayor, antiguo, monstruoso, verdadero “brontosaurio” y un cuasi fósil de la tecnología orientada a las transacciones de negocio. Este participante en cuestión ha liderado por años, lustros y décadas en su nicho, impávido, aparentemente aletargado…. Oculto. Qué digo liderado; ha reinado, gobernado, tiranizado y encabezado el submundo de las grandes transacciones financieras y de negocios por un muy, pero muy largo periodo de tiempo.

Este monstruo solapado, se ha renovado, se he colocado hábilmente maquillaje, ha hecho dieta y ejercicios, y ha visto pasar uno tras otro a cada uno de los que, como Java y sus consortes, han pretendido ir por su trono.

domingo, 3 de enero de 2016

Obtener nivel de acceso (permisos) sobre un archivo en RIDC con Java

Parte de las tareas comunes que enfrentamos cuando trabajamos con el Oracle UCM por medio de la api RIDC, es la de validar los permisos de acceso de un usuario sobre un archivo cualquiera dado su Id de documento.

Para ello nos valemos de una implementación de la interface IUserSecurityCache, y usamos el método getAccessLevelForDocument(...).
Dejo a continuación un fragmento de código de ejemplo:
 
public class RIDCBusiness { 
  public static int getAccesLevelForDocumentByIdAndUser( 
  String idConnectionURL, String usernameForConnect, 
  String userNameToCheck, String documentId) { 
  int levelAccess = -1; 
  try { 
    final IdcClient mclient = getUCMConnection(idConnectionURL, 
    usernameForConnect); 
 
 // RIDC superuser context 
 // use las credenciales adecuadas a su plataforma 
    final IdcContext msuperuser = new IdcContext("weblogic", "weblogic"); 
    final IUserSecurityCache mSGAcctAclCache = new UserSGAcctAclCache(mclient, 20, 1000, 20000, msuperuser); 
    final DataBinder docBinder = getDocInfoByDocId(idConnectionURL, 
    usernameForConnect, documentId); 
    if (docBinder == null) 
      return levelAccess; 
    final DataObject docInfo = docBinder.getResultSet("DOC_INFO").getRows().get(0); 
    final IdcContext context = new IdcContext(userNameToCheck); 
    final CacheId userToCheck = new CacheId(context.getUser(), context); 
    final ITrace trace = null; 
 
    levelAccess = mSGAcctAclCache.getAccessLevelForDocument( 
    userToCheck, docInfo, trace); 
  } catch (final Exception e) { 
    Logger.getLogger("RIDCBusiness").error("Error en getAccesLevelForDocumentByIdAndUser", e); 
  } 
 
  return levelAccess; 
 } 
 
 public static IdcClient getUCMConnection(String idConnectionURL, String username) throws IdcClientException, IOException { 
   final IdcClientManager clientManager = new IdcClientManager(); 
   final IdcClient client = clientManager.createClient(idConnectionURL); 
   return client; 
 } 
 } 
 
 public static DataBinder getDocInfoByDocId(String idConnectionURL, String username, String documentId) { 
   ServiceResponse serviceResponse = null; 
 
   try { 
     final IdcClient client = getUCMConnection(idConnectionURL, username); 
     final DataBinder dataBinder = client.createBinder(); 
     final IdcContext userContext = new IdcContext(username); 
     dataBinder.putLocal("IdcService", "DOC_INFO"); 
     dataBinder.putLocal("dID", documentId); 
 
     serviceResponse = client.sendRequest(userContext, dataBinder); 
     final DataBinder response = serviceResponse.getResponseAsBinder(); 
     return response; 
   } catch (final Exception ex) { 
     Logger.getLogger("RIDCBusiness").error("Error en getDocInfoByDocId", ex); 
   } finally { 
     if (serviceResponse != null) 
       serviceResponse.close(); 
   } 
   return null; 
 } 
}
Básicamente obtenemos un número que, de ser mayor que 0, indica el nivel de acceso que tiene el usuario dado sobre el documento deseado.
Los niveles de acceso predefinidos son:
  • READ
  • READ/WRITE
  • READ/WRITE/DELETE
  • READ/WRITE/DELETE/ADMIN
Esta publicación es complemento de la publicación anterior que mostraba como acceder a la información de los folios.

Código para acceder a los Folios de Oracle UCM mediante la API RIDC con Java

En un reciente proyecto me vi en la necesidad de trabajar con el Oracle Universal Content Manager (UCM) mediante a API de RIDC. Abundan en la web ejemplos de como hacer esto, lo cual fue una gran ventaja para mis tareas. No obstante, fue más difícil encontrar en buen ejemplo para acceder a los FOLIOS del UCM, e incluso me encontré con algunos problemas a la hora de pasar los parámetros en forma adecuada.
Es por ello que hoy dejo un breve fragmento de código que muestra como acceder a los servicios de RIDC mediante Java.

Para ello creé un proyecto Java en eclipse, y agregué las librerías oracle.ucm.ridc-11.1.1.jar y oracle.ucm.ridc.was-lib-11.1.1.jar.
Use un Pojo, ConsultaDocumentos, para modelar los documentos. Este Pojo puede ser usado en un contenedor de Vaadin u otro framework para representar los resultados de los documentos contenidos en un FOLIO de Oracle UCM.

Clases "Controladoras" y algo mas




Ejemplo:
Imagine el escenario donde Ud. llega a un local de comida rápida, seguramente ha hecho esto alguna vez en su vida, lo primero que hace es ir y decirle al cocinero, en voz alta por supuesto: “oye tu, quiero una hamburguesa doble carne bien cocida”, seguidamente le dice al muchacho de los refrescos: “me preparas una gaseosa enorme” y por último le dice al de las ensaladas: “¡me pones de todo con un poco de todo encima!”.

¿No es así como se acostumbra? 
Parece que no. 

Bien hagamos algunas correcciones. Ud. llega al local y lo recibe un cajero; nada de estar pegando gritos al cocinero y al resto del personal, seguidamente el cajero toma su pedido y él si procede a decirle al cocinero lo que Ud. quiere, le grita al de los refrescos su orden, y claro está, habla con el de las ensaladas para que le ponga de todo.

El egoísmo es una virtud



Algunos conceptos objetivistas resultan chocantes, y requieren algo de explicación para los humanos.

El egoísmo es una virtud
Para el objetivismo el egoísmo racional es una virtud, y cualquier forma de altruismo es inmoral, ya que no hay ningún motivo racional para poner las necesidades de los demás por delante de las necesidades racionales propias....
A los egoístas irracionales (por ejemplo a los nietzscheanos) Ayn Rand los llamaba «egoístas sin ego», ya que los caprichos emocionales no son el ego. El ego es la razón.
El orgullo es una virtud
Para el objetivismo el orgullo racional es la corona de todas las demás virtudes. Si uno se esfuerza en llevar una vida racional y productiva, uno se gana el derecho a estar orgulloso de los valores morales y materiales que uno obtenga.
  • No obstante, el objetivismo condena inequívocamente los orgullos irracionales: El orgullo de ser de determinado país, de pertenecer a una u otra raza o tribu, de tener grandes riquezas heredadas, de pertenecer a una familia con títulos nobiliarios... En ninguna de estos casos el individuo ha hecho nada para ganarse el derecho a estar orgulloso.
La humildad es un vicio
Inversamente, la humildad (entendida como la baja autoestima) es un vicio, ya que el humilde se considera a sí mismo como poco valor y no mejor que los demás. Para el objetivismo, el estar en este estado y considerarlo como bueno mata cualquier tipo de ambición moral en el individuo.
  • Si un individuo está en este estado, tras una evaluación sincera de uno mismo, lo que uno debe hacer es luchar por mejorarse a sí mismo para así poder ganarse el derecho a estar orgulloso.
  • Si un individuo es humilde a pesar de tener virtudes, es decir, si el individuo elige no apreciar las propias virtudes por temor a ser calificado de orgulloso, el objetivismo sostiene que ese individuo está en guerra consigo mismo y con la realidad.
El extremismo es bueno
Para el objetivismo, los cultos al «término medio», al compromiso y al consenso son sintomáticos de inseguridad en los propios valores y en las propias decisiones, consecuencia inevitable de la filosofía de Platón y Kant y de sus derivados, que sostienen que el conocimientoseguro sobre el mundo es inalcanzable. Es por esto que para el objetivismo, el extremismo es considerado como algo «bueno».
El objetivismo sostiene que si partiendo de premisas correctas y siguiendo una epistemología correcta uno identifica algo como bueno, lomoral es llevarlo hasta sus últimas consecuencias.

Para saber mas: http://es.wikipedia.org/wiki/Objetivismo

Yo, El Supremo.

sábado, 2 de enero de 2016

La Muchedumbre Idiota

                                                     Para el sotreta:
                                                     Hace tiempo que dejé de saber que hacer contigo

             La Muchedumbre Idiota

Tengo que cuidar de los estúpidos
Su oceánica ignorancia me alimenta
Su miseria infinita me sostiene
Matar a todos quiero
Pero quedaría solo
Sin interlocutor y sin empleo
En quien descargaría mi soberbia brutal
Son además una invencible mayoría
Sólo con los hongos y las moscas rivalizan
Tal vez algún respeto se merezca
Esta infame pelota de babiecas
Yo creo que son la lección y la burla
Suprema de los dioses
¡alabados sean!


                                           Robin Camero

Not zero code Nor complex process


Cualquier herramienta o solución de BPM de buen nivel ofrece un conjunto loable de funciones que facilitan la gestión de procesos con dichas herramientas.

Una de las opciones infaltables y de las mas promovidas por los consultores y vendedores de soluciones de BPM es la de ZERO CODE, cero codigo; la cual consiste en la habilidad de obtener una aplicación capaz de ejecutar nuestros procesos con apenas unos clicks.

La idea general es que se reduzca el desarrollo de aplicaciones a la medida y la programación global, dejando toda la tarea de la automatización y construcción de aplicaciones sobre los recursos que provee la solución de BPM.

Siendo honestos, esta funcionalidad está muy bien cuando se inicia un proyecto de BPM, en la etapa en la que se modelan los procesos y es necesario validarlos, para lo cual no existe nada mejor que un prototipo rápido que es lo que brindan muchas herramientas de BPM.

Los problemas empiezan cuando se quiere implementar proyectos grandes de BPM con estas herramientas, y es aqui en donde entra el otro elemento del título de esta publicación: los procesos complejos.

Y por complejos me refiero a procesos con mas de 12 tareas humanas y mas de 5 actores con roles diferentes. Así mismo, son procesos que requieren perisistir una gran cantidad de información, integrarse con varias plataformas y consumir uno o mas servicios diversos.

En general el desarrollo de estos procesos sobre las plataformas de BPM habituales redunda en aplicaciones inestables, con una capa de presentación mediocre o poco funcional y con un requerimiento de mantenimiento elevado.

He visto muchos grandes proyectos construidos con grandes herramientas de BPM ir directo al fracaso debido a la mala implementación de la solución realizada completamente sobre el motor de BPM y sus recursos.

En general los motores de BPM son excelentes para la orquetsación de tareas y la asignación de responsabilidades. En otras palabras son inmejorables para garantizar el control: que lo que deba ser realizado sea realizado por quien debe realizarlo cuando deba hacerlo.

Se les considera menos eficientes para producir aplicaciones de gran funcionalidad que trabajen sobre esos procesos. Sencillamente el desarrollo y mantenimiento de aplicaciones no es su fuerte.

Por esta razón cuando me toca evaluar una herramienta de BPM no me dejo seducir por sus deslumbrantes capacidades de modelado y despligue rápido de de aplicaciones. No señor.

Lo que busco es conocer a fondo sus facilidades de integración con diversas plataformas. Escudriñar sus facilidades para trabajar con datos complejos de diversas fuentes. Determinar sus capacidades en cuanto a las distintas APIs y modos integración que ofrecen.

Es en este último tópico en el que centro mi esfuerzo, pues son de las APIs de las que va a depender el grado de control externo que pueda brindarme una solución de BPM cualquiera.

En otras palabras, voy a usar frameworks de trabajo bien conocidos para integrar la solución de BPM con mis aplicaciones nativas y dedicadas.

No construiré un sistema de compras públicas sobre un motor de BPM. Por el contrario, desarrollaré un sistema de compras públicas orquestado e integrado por y con el motor de BPM.

En este desarrollo manejaré los procesos como módulos lo mas independientes y sencillos posibles, para de esta forma poder gestionar con eficiencia esos procesos y sus aplicaciones dependientes.

Nada viene sin un precio, y el desarrollo y el mantenimiento efectivo son el precio que pagamos por un mayor contro y mejores prestaciones sobre nuestras aplicaciones de BPM.

Hasta que las herramientas o soluciones de BPM no evolucionen lo suficiente seguiré promoviendo y prefieriendo el fiel desarrollo eficiente sobre la, para mi, errada política de ZERO CODE y COMPLEX PROCESS.

Las “soluciones” estúpidas



No sin asombro veo como en estos canales seudocientíficos de TV, ante la problemática del creciente tráfico y largas colas en las principales ciudades del mundo, nos ofrecen como solución el hacer vehículos más pequeños y eficientes. Eso puede parecer una “solución” a corto plazo, pero que es el corto plazo para una ciudad? En realidad es nada. Con el actual crecimiento de las ciudades en poco menos de 20 años se tendría nuevamente el mismo terrible problema del tráfico, con la salvedad de que ahora son inmensas colas de vehículos mini muy “eficientes”.

Para muestra de lo que digo les dejo un par de enlaces con videos del tráfico en Vietnam. Saquen Uds. sus propias conclusiones.

http://www.youtube.com/watch?v=-JNWucQJGVI
http://www.youtube.com/watch?v=ebkogYErN3Y&feature=related

El problema no es El Tamaño de los Vehículos. El problema es la cantidad de Recursos y Elementos gastados para el transporte particular e individual. El automóvil promedio en una cola sólo lleva en 1.3 pasajeros como media. Todo ese espacio, materiales, combustibles y demás recursos usados para mover poco más de una sola persona.

La solución no pasa por una sola propuesta. Son necesarias acciones políticas, culturales, comerciales, legales y científicas para alcanzar una mejora que perdure por lo menos 80 años. Cosas tales como:
- Disminuir la necesidad de movilizar personas (Tele trabajo, Tele servicios, etc.).

- Disminuir el número de personas que deben movilizarse a un mismo horario (Todo el mundo debe estar en el trabajo a las 8:00?).
- Transporte público masivo y eficiente.
- Altos impuestos al transporte individual y con motor de emisiones de carbono.
- Descentralizar las ciudades y servicios.
Estas son solo algunas propuestas que merecen ser revisadas para lograr un compendio aceptable de lo que llamaríamos una Solución Inteligente.

Saludos cordiales.

P.D.: Tengo entre manos propuestas más radicales tales como disminuir la población mundial en un 60%!!! Pero la discusión de este magnicidio escapa del contexto de este artículo.

¿Hay vida inteligente EXTRATERRESTRE?


Recientemente una querida amiga me realizó, en forma casual. El siguiente comentario:

Amiga - ¿Viste lo de Stephen Hawking?
- No, ¿qué pasó?
Amiga – ¡El tipo dijo que estaba científicamente demostrada la existencia de extraterrestres!... y de paso advirtió que no vienen con buenas intenciones. Que lo que vienen es a apoderarse de los recursos.
- ¿En serio?...

Y precedí a manifestarle mi escepticismo y cuidado ante tales afirmaciones. Que para afirmar de esa forma se deben tener pruebas contundentes y científicamente demostrables.

Lo cierto es que me quedé sorprendido y prometí averiguar más sobre el tema. Y lo hice.

Lo que ocurrió fue que el Profesor Stephen Hawking, alias el tullido como yo le llamo cariñosamente, en abril de este año afirmo en un programa para Discovery Channel que:
“El profesor ha asegurado que es "perfectamente racional" asumir vida inteligente en otros lugares, aunque advierte de que los 'aliens' posiblemente harán incursión en la Tierra para proveerse de recursos y luego se irán.”

Enlace del artículo: http://www.elmundo.es/elmundo/2010/04/26/ciencia/1272276555.html

Lo primero que destaco es que ciertamente es perfectamente racional, por las posibilidades matemáticas, asumir vida inteligente extraterrestre. Es una posibilidad. Y sólo eso. Una posibilidad. Pero de allí a decir que está “Científicamente Demostrado” es otra cosa. Lo último es una mentira. Una posibilidad, por alta que sea, no se puede asumir como una certeza hasta la debida comprobación. Y eso, la comprobación, no se mencionó, discutió ni se trató de forma alguna en el mencionado programa, puesto que se habló en todo momento de una posibilidad matemática.

Respecto a la afirmación: De existir vida extraterrestre seguramente vendrían por los recursos, pues me parece bien razonable, pues no debemos asumir otra cosa al no saber que esperar de una inteligencia distinta a la nuestra. Pero el punto importante es que se sigue hablando de un supuesto, por lo que afirmar que “a quienes están contactando con extraterrestres” es nuevamente otra mentira. No se afirma el hecho del contacto en ningún momento. Tan sólo se afirma que deberíamos abandonar nuestros intentos de contacto, lo que, nuevamente, es una cosa bien distinta.

No pienso extenderme en los detalles de las sin número de discusiones y opiniones, interesantes algunas y abiertamente estúpidas la mayoría, que despertaron estas opiniones del tullido.
Leído y revisado todo este asunto debo afirmar categóricamente que el título de este artículo es inapropiado.

Corrijo pues el título: ¿HAY VIDA INTELIGENTE EN LA TIERRA?

Bueno, Malo, Mejor, Peor...


Bueno, Malo, Mejor, Peor, etc...

Todos ellos juicios de valor. Los emitimos diariamente, alegremente, todos tenemos una opinión y no dudamos en calificar. Es natural. No obstante, ¿cuantos de nosotros nos hemos detenido a pensar en las bases, fundamentos, razonamientos y contexto que sustentan a nuestros juicios?

Explico me. Si emito el juicio de que “esto” es Mejor que “aquello”, ¿en que fundamento mi afirmación? ¿cual es el criterio o parámetros utilizados para respaldar tal juicio?

Existen áreas en las que es relativamente sencillo establecer parámetros y escalas de valores. En otras no tanto. Entre las primeras tenemos las ciencias numéricas y entre las segundas a las artes literarias por ejemplo. ¿Como sabemos que un libro es bueno? En estos casos no basta con el libro me guste para calificarlo de bueno. Eso es sólo mi vulgar opinión si no puedo respaldarla con razonamientos fundados.

Es allí donde las escalas tienen su reinado, puesto que permiten homologar criterios, establecer estándares y delinear principios para una evaluación o juicio cercanamente objetivo.

Las escalas tienen un carácter criminal. Se fundamentan en eliminar la subjetividad, los pareceres, las impresiones y demás sutilezas que en general “nublan” el juicio.

Pongamos el siguiente ejemplo:
Tenemos un Esquimal que vive usualmente a unos -20 grados centígrados.
Y tomemos a un Bosquimáno que vive en temperaturas que rondan los 40 grados centígrados a la sombra.
Sí ponemos al Esquimal en un sitio a unos 21ºC seguramente nos dirá algo como “Hace Calor”.
Si colocamos al Bosquimáno en el mismo lugar y a los mismos 21ºC nos dirá algo como “Hace Frío”. Entonces, ¿Hace frío o hace calor?¿Como resolvemos este dilema?
Sencillamente “matando” al negro y al esquimal!! y esto se logra mediante una escala.

Hace 21ºC. Ni frío. Ni calor. Sólo 21ºC.

Obviamente esta escala aniquila a los participantes y sus pareceres, sus impresiones culturales, somáticas y demás ideas sobre como está la temperatura del citado lugar.

Las escalas nos dejan con la “frialdad” de los números al eliminar el “calor” humano de la ecuación de evaluación.

¿Son “buenas” las escalas? ;-)