Unos correos del 2001 interesantes sobre activex


Clases, Tipos fuertes y parámetros

Tipos fuertes

Uno de los detalles que hacen utilizable realmente a Visual, es una mezcla entre los tipos de datos fuertes y débiles. Que es esto? Bueno, a grandes rasgos, Turbo Pascal se distinguió en su momento por la capacidad de darle un tipo determinado a una variable, por ejemplo, byte, shortint, string, longint, char, text, por decir algunos. Aunque las versiones originales de Basic, QBASIC y BASICA permitían una declaración de tipos fuertes, Los que usamos BASIC en ese tiempo, estábamos acostumbrados a ordenes como DIM NOMBRE$, donde el $ era equivalente al actual as String.

Por razones de compatibilidad, y de sentido común estructurado, poco a poco Microsoft fue creando una gran variedad de tipos de datos, algunos utiles y otros no. Por ejemplo, estan String, Variant, Object, Integer, Boolean, Single, Double. Pero, debido a que muchos programadores estaban acostumbrados a hacer las cosas a la carrera, desde la primera versión de Visual Basic for Dos, se tuvo que permitir utilizar tipos debiles, que significa esto ?

Un programador poco experimentado podía no declarar una variable, o cambiarle de tipo sobre la marcha. Un programa podía ser, por ejemplo:

10 nombre = space(30)
20 input nombre
30 print nombre
40 nombre = 0
50 for nombre = 1 to 10
60 hazotracosa
70 next nombre
80 goto 10
El verdadero problema fue que BASIC no solamente empezó a usarse por estudiantes, como fue en su momento, sino por profesionales que no tenian a la mano un compilador de Fortran, Pascal, o C. Y como Basic venía incluido en el MSDOS, Microsoft se encontró con que los programadores «avanzados» necesitaban características que no existian; por lo mismo el compilador en si tuvo que adaptarse. Recuerdo que en un momento dado Borland sacó un compilador llamado Turbo Basic, que compilaba en base a tipos fuertes. Para evitar la perdida del mercado, cuando se empezó a Promocionar el QBASIC, ya permitia usar tipos fuertes o debiles, sin embargo, empezaron a suceder problemas porque algunos programas hechos en BASICA, no funcionaban con el nuevo compilador, porque estaban hechos con tipos debiles.

Microsoft creó entonces un tipo de datos similar a lo que es el «any» a Lenguaje C, y su problema básico quedó resuelto. Pero se crearon problemas nuevos, para variar, el nuevo tipo fue llamado VARIANT, y es el tipo de datos predefinido por Visual Basic en las versiones actuales.

Porqué se crearon problemas? Bueno.. Aqui debo regresar otra vez a los tiempos de TP y C. El principal inconveniente de Turbo Pascal era la limitación de un programa a 64 kb de código y 64 kb de «data»; esta era una limitación porque por ejemplo, definir una cadena como string[255], usaba 255 bytes de 64,000 disponibles. Empezó a ser obligatorio andar haciendo ajustes en TP para convertir longint a shortint, y demás. (Esto no es estrictamente cierto, pero si usabas punteros en Turbo Pascal no tienes nada que hacer leyendo esto).

Visual no tenía este problema. Lo unico malo es que su tipo de datos Variant ocupaba bastante mas memoria que un integer, por ejemplo. Y un Variant permitía al mismo tiempo hacer cosas que no se debían segun los puristas. Utilizando el ejemplo anterior, la versión VB sería

dim nombre as string
nombre = space(30)
nombre=inputbox(«Introduzca el nombre»,,nombre)
print nombre
nombre = 0
for nombre = 1 to 10
hazotracosa
next nombre
Que si bien es perfectamente válido, permite errores como sumar algo que no debería sumarse. Pero si cambiamos el Dim nombre, por un Dim nombre as string, ya no es posible compilar el programa. Usando la metodología de tipos fuertes, el código debería ser:

dim nombre as string
dim i as integer
nombre = space(30)
nombre=inputbox(«Introduzca el nombre»,,nombre)
print nombre
for i = 1 to 10
hazotracosa
next i
Esto tuvo una serie de efectos no apreciables a largo plazo. Realmente el principal problema fue que los programas que no definian el tipo, es decir, que decian dim variables sin decir el tipo ( as string por ejemplo ), ocupaban a veces 10 o doce veces mas memoria de la necesaria. Se ha hablado mucho de elegir los tipos de datos correctos al programar, usar en lo posible integer por ejemplo, que esta ligado al sistema operativo y ademas de usar menos memoria que un long, se ejecuta mas rapido.

Para fines prácticos, lo que necesitamos saber es que ademas de los tipos de datos tradicionales, existen dos tipos llamados comodines, que son Variant y Object. Mas adelante hablaremos sobre Object. Un ultimo detalle es que los tipos en Visual Basic, si no se define el tipo, quedan como variant por default, ejemplo:

dim a,b as string ‘ a es variant, b es string
dim c,d ‘ c y d son variant
dim e as string, f as string ‘ los dos son cadena.
Quiero destacar que no necesariamente usar Variant es malo, solo que tiene la desventaja de ser mas lento y usar más memoria, pero hay ocasiones en que voluntariamente a fuerzas la solución mas elegante es usar variant en algun proceso. Sin embargo, creo que un buen programador siempre debe de tratar de usar en lo posible tipos fuertes ( y se evita el problema de hacer «casting» como en lenguaje C ).

Parámetros

En el correo anterior mencionamos algunas cosas sobre los sub y function, pero hay que hacer de una vez una aclaración importante. Los Function o funciones, pueden ( y en casos ideales deben ) regresar un tipo fuerte. Si nosotros no especificamos el tipo, obtendremos un variant. Veamos un ejemplo:

private function nombre_empresa
dim pass as string
pass=»www.laempresa.com»
nombre_empresa=pass
end function
Fuera de toda lógica aparente, el resultado será un variant y no un string. Lo correcto sería:

private function nombre_empresa as String
Muchas personas se preguntan que es un parámetro y para que nos sirve. Nos sirve para modificar nuestro código sin tener que hacer gran cambio. Por ejemplo, supongamos que hemos hecho un programa que usan nuestras diez sucursales, pero no queremos hacer una funcion diferente para cada una. Vamos a suponer que de un lugar determinado, leimos el numero de la sucursal o empresa y lo guardamos como la variable numcons. Y mas adelante queremos hacer un reporte que de un encabezado diferente para cada sucursal. Podríamos usar algo similar a:

private function nombre_empresa (num_empresa) as String
dim pass as string
select case num_empresa
case 1: pass= «www.laempresa.com»
case 2: pass= «www.laempresa2.com»
case 3: pass= «www.laempresa3.com»
case else
pass = «Empresa desconocida !!!!»
end select
nombre_emperesa=pass
end function
Este código nos permite de manera muy simple usar en la cabecera del reporte un print nombre_empresa(numcons), que hace el código mas legible.

Es importante destacar que podemos usar también tipos fuertes en los parámetros, e igual que dijimos antes, si no especificamos el tipo por default tomará variant, por lo que si queremos tipos fuertes, deberíamos declararlo así:

private function nombre_empresa (num_empresa as integer) as String
Parámetros por referencia y por valor

Otro de los detalles que nos heredó BASIC / BASICA, fue que cuando empezaron a usarse los procedimientos en la versiones mas avanzadas, los procesos a veces cambiaban el valor de una variable. Por ejemplo, supongamos un sub que genera el cuadrado de un numero:

numero=4
msgbox numero
call cuadrado(nume)
msgbox numero

private sub cuadrado(nume as integer)
nume=(nume*nume)
end sub
Nos da una desagradable sorpresa. Numero ahora vale 16, aunque no debía ser. Esto se debe a que por default, Visual Basic toma los parámetros por referencia, es decir, considera el parámetro como el NOMBRE de lo que debe cambiar. Una aproximación mas razonable, y menos propensa a errores, sería declarar lo anterior como una función o function, ya que obviamente regresa un valor, asi que por principio de cuentas no tiene nada que hacer como sub.

numero=4
msgbox numero
msgbox cuadrado(nume)
msgbox numero

private function cuadrado(BYVAL nume as integer)
nume=(nume*nume)
cuadrado=nume
end function
Esto nos permite evitar efectos secundarios en el código. La palabra Clave BYVAL es un indicador que le dice a Visual Basic, que solo tome el VALOR del parámetro, sin alterarlo. Los que han seguido las lecciones desde el principio, recordarán que dije que usar parámetros byval nos quita muchos quebraderos de cabeza. Ahora es posible entender de manera mas completa el ejemplo que puse en el correo anterior:

Public Function Padl(ByVal cadena As String, ByVal largo As Byte) As String
If Left(cadena, 5) = «- » Then cadena = Trim(Right(cadena, Len(cadena) – 5))
If largo >= Len(cadena) Then ‘ no simplificar
Padl = String(largo – Len(cadena), » «) & cadena
Else
Padl = cadena
End If
End Function
La regla es usar siempre BYVAL en los parámetros, y si necesitamos el modo standard , usar en su lugar la palabra clave BYREF, aunque esto no es obligatorio puede hacernos la vida bastante mas sencilla. Finalmente nuestra función quedaría:

private function nombre_empresa (byval num_empresa as integer) as String
Además nos protege si por error cambiamos el valor de num_empresa dentro del proceso, y al ser byval, un beneficio adicional es que el código se ejecuta mas rápido.

Clases

En la lección anterior decíamos que una unidad de Turbo Pascal nos permitía procesos publicos y privados. Una clase de Visual Basic, disponible desde la versión 4, nos permite lo mismo, sin embargo, para fines prácticos vamos a referirnos solamente de VB 5 en adelante. Un detalle interesante, es que una clase de Visual Basic NO es algo orientado a objetos, por lo menos en su forma pura. Los que han manejado OOP conocen terminos como herencia, polimorfismo, etc, pero VB no permite algunas de las características distintivas de los objetos, por lo menos en la forma tradicional.

El tema de las clases es muy extenso, y lo tomaremos en las siguientes lecciones. Por mientras , sugiero que hagan un pequeño experimento. El archivo Bas que generamos en el correo anterior, desde windows o sistema operativo cambienle la extensión de BAS a CLS

Unos correos del 2001 interesantes sobre activex.


abemos que un buen programador o equipo de programadores no reinventan el hilo negro cada rato. Para poder llevar un control de lo que se ha hecho, es comun que usemos partes de nuestros programas anteriores. Si bien era común que se usara el modo de cortar y pegar hasta 1990, cuando se popularizó el uso de Turbo Pascal, de Borland, se le dio difusión a la idea «aparentemente» nueva de encapsular los procesos usandolos en varios proyectos, en versión compilada. Estos trozos reutilizables y NO MODIFICABLES POR TERCEROS de código, eran llamados units, o unidades, y eran muy parecido a lo que hacía C, pero se manejaba desde dos puntos de vista:

Interfase >( Rutinas publicas a otros proyectos )
Implementation ( Rutinas internas a este proyecto )
Junto con la implementación de un sistema llamado de «tipos fuertes», esto provocó que Turbo Pascal se hiciera un favorito en su tiempo, y ahora es un lenguaje gratuito en la versión 5.5 y esta disponible en el mismo sitio de Borland, o en la sección de archivos del grupo.

Con el paso del tiempo Clipper tuvo que crear una versión similar, creandose las llamadas Librerías, que permitian lo mismo solo que todos los procesos eran interfase, es decir, publicos. Aqui se dieron las primeras posibilidades reales de integración multilenguaje, entre MASM, TASM, C estandar microsoft, y clipper / dbase. Cabe destacar que una ventaja extra de estas librerías de CLipper era que podian usarse en diversas versiones del compilador y en cierta medida por otros lenguajes, mientras que las librerías de TP eran unicas para version de compilador, una librería 5.5 no funcionaba con 6, por ejemplo. Estos son los archivos LIB, que reconocerán los que usan librerías de terceros, como CATOOLS, FASTLIB, o mi propia CADMUS, UNIT.

Las dos principales diferencias de las versiones actuales de Visual Basic contra las versiones de QBASIC o BASICA, son los llamados tipos fuertes, que veremos mas adelante, y la posibilidad de crear procesos publicos y privados.

Todos sabemos que podemos crear functions y subs, que devuelven y no respectivamente un resultado. Los famosos archivos BAS que vemos en los proyectos, son librerías de SUB y FUNCTION, que son publicas a todo el proyecto. Sin embargo, estas rutinas deberían ser lo suficientemente generales y bien diseñadas para poder usarse en varios proyectos. Por lo general los sistemas realmente pesados que suelo hacer en VB, tienen tres modulos:

proyecto.bas ( por ejemplo, perfum.bas, inv_equipo.bas ) donde guardo el código que solo sirve para este proyecto por ser demasiado específico.
reporte.bas Aquí guardo el codigo que genera todos los reportes de este proyecto. No hay confusion de nombres porque cada proyecto tiene su directorio.
clasific.bas Las rutinas generales que no he enlazado en una clase.
Vamos a suponer que ya tenemos una serie de procesos que podemos usar en otros programas y queremos volverlos un control. Vamos a suponer que no tienen que ver con los controles que estan en ningun formulario, es decir, vamos a suponer que no tenemos ninguna llamada tipo

Form1.Caption=»Este es el nombre de mi programa»
Para este caso usaré tres rutinas que uso mucho en mis proyectos, y que son «hijas» de CLipper. Cada una de ellas se parece a una orden de clipper, pero es su versión en VB.:

Taller:

Crear un nuevo modulo de VB al que le pondremos clipper.bas, y pondremos dentro este código:

option explicit
Public Function strtran(ByVal origen As String, anterior As String, nuevo As String)
Dim posicion As Integer
Dim cadpaso As String
Do
posicion = InStr(origen, anterior)
If posicion = 0 Then Exit Do
cadpaso = Left(origen, posicion – 1) & nuevo
cadpaso = cadpaso & Right(origen, Len(origen) – (posicion + Len(anterior)) + 1)
origen = cadpaso
DoEvents
Loop
strtran = origen
End Function
Public Function Padl(ByVal cadena As String, ByVal largo As Byte) As String
If Left(cadena, 5) = «- » Then cadena = Trim(Right(cadena, Len(cadena) – 5))
If largo >= Len(cadena) Then ‘ no simplificar
Padl = String(largo – Len(cadena), » «) & cadena
Else
Padl = cadena
End If
End Function
Public Function Padr(ByVal cadena As String, ByVal largo As Byte) As String
If Len(cadena) > largo Then cadena = Left(cadena, largo)
Padr = cadena & String(largo – Len(cadena), » «)
End Function
Public Function Padc(ByVal cadena As String, ByVal largo As Byte) As String
If Len(cadena) > largo Then
Padc = cadena
Else
Do Until Len(cadena) = largo
cadena = cadena & » »
If Len(cadena) = largo Then Exit Do
cadena = » » & cadena
Loop
End If
Padc = cadena
End Function
Una vez que tenemos hecho lo anterior, podríamos utilizar este archivo con atributo de solo lectura, en varios proyectos. Porque de solo lectura? Porque lo que se tiende a hacer es o cortar y pegar, o modificarlo directamente. Un problema de modificar directamente en cada proyecto un modulo ( que asi se llaman los archivos BAS ), es que podemos terminar con muchas versiones ligeramente distintas del proceso, o peor aun, con versiones que no funcionan en todos los sistemas. Me tocó ver una empresa con quince programas que comercializaban, todos con su grales.bas, proc.bas, y func.bas… pero a veces completamente diferentes entre un proyecto y otro.

Otro problema que podemos tener es lo engorroso que resulta reutilizar un archivo bas en diferentes proyectos, si usamos Source Safe o si otros programadores tienen acceso a el. Una de las escenas mas hilarantes y deprimentes al mismo tiempo que me tocó ver, fue un pleito entre dos programadores que por orden de su jefe inmediato estaban haciendo un sistema entre los dos, pero cuando uno modificaba el codigo, el del otro programador ya no funcionaba. Todos conocemos casos así, no ? Sin embargo, un control o librería o Unit compilada, o el equivalente en cada lenguaje, puede crear una gran uniformidad de código. Desde el punto de vista de los datos, el objetivo que se tiene es tener una sola tabla de usuarios que usen todos los sistemas de la empresa, y no que cada programador o programa tenga su propia tabla de usuarios.

Sin embargo, en lo que reunimos la cantidad adecuada de rutinas, Y LAS PROBAMOS, los modulos son una alternativa viable, que mas adelante podremos convertir a clases y controles, conservando las ventajas, ganando otras, pasando a una sola desventaja.

Unos correos del 2001 interesantes sobre activex.


Creo que es tiempo de empezar a ver los controles OCX, que son y para que nos sirven, y para que NO nos sirven.

Asi como poco a poco hemos ido viendo datos sobre acceso a datos, empezaremos a ver de manera clara y gradual el manejo de controles OCX. Les aviso desde ya que esta introducción a muchos puede no gustarles, o parecer que yo diga que no sirven. Lo que quiero decir es que no puedes hacer todo con controles OCX, y que los controles no suplen los métodos normales de programación. No todos los desarmadores sirven para todos los tornillos. A partir del próximo correo empezaremos a ver para qué si sirven realmente los controles OCX. Asi como RDO sirve para ciertas cosas, no se debe de usar para desarrollos nuevos, por razones varias que comentamos en otro lugar y que pueden consultarse en muchísimos mas.

Empecemos sobre lo que no se debe hacer con los controles.

Historia

Para evitar confusiones comento que solo haré referencia a las clases desde VB5, aunque con VB4 se puede, es algo engorroso describir aquí.

Pasemos a la historia de los controles OCX. En 1993 Microsoft utilizaba una tecnología llamada OLE, en la que se podian establecer Lazos desde aplicaciones. Bruce Hinskey ( Autor del libro hardcore Basic ) tenía que ver con la definición de standares para los controles.

No se sabe bien de quien fue la idea, pero al mismo tiempo un grupo de Microsoft trabajaba en lo que se llamaba Excel Basic y Word Basic ( que en paz descansen ) pero aunque eran funcionales para hacer código, tenían el problema de que no funcionaba entre diferentes versiones del mismo producto, es decir, algo hecho en Excel en Ingles, no funcionaba en Excel en Español.

Mientras tanto se habia creado una nueva generación de empresas dedicadas a vender «anexos» a Visual Basic 3, que tenían la extensión VBX y generalmente estaban hechas en C. Todo esto era en la epoca de Windows 3.11.

Pues cuando se preparó VB4 surgió el problema de que ya se iba a manejar a 32 bits el sistema operativo, con Windows 95, y por lo mismo se hizo un desarrollo enfocado a poder usar diversos lenguajes, utilizando la idea de VBX pero aplicandola a otros lenguajes.

Esto fue la primera versión de OCX. Sin embargo, al poco tiempo a alguien se le ocurrió ligar los OCX con las clases, y se desarrolló un nuevo Standard llamado OCX 96 , al que conocemos mas bien como Activex. Pueden leer una pagina que tengo sobre activex en Active X .

Después empezó a surgir otra vez un mercado de controles personalizados para suplir las deficiencias de los de Microsoft, los mas conocidos son Sheridan, una empresa que generó el TrueGrid ( No recuerdo cual ) y otras importantes como Merant y Sybase con su Formula One.

Pero.. el mal código y el mal diseño son malos por donde se mire, y surgieron grandes problemas:

El mal diseño es malo aquí y en China

1)

A partir de la versión 5 del VB, era posible desarrollar controles ( hasta salió un VB5 Control edition, si no me equivoco ) , pero la mayor parte del código disponible correspondía a programadores que se complicaban la vida. Voy a explicarlo de otra manera:

Todos sabemos que algo que no está enabled no puede tener el foco, pero alguien hacia este proceso:

private function Pon_Foco( micontrol as control)
if micontrol.enabled then
micontrol.setfocus
else
‘ no puedo poner foco,
endif
end sub
Ese programador juntaba diez rutinas similares, Luego lo volvía control OCX, y quería que le pagaran por ello 30 dolares.

Otra forma que sucede es a la inversa.

Sabemos que :

2*2=4
2+2=4
1+1+1+1=4
2*2*2/2=4
.25*8=4
Y muchos controles y clases OCX son así. 8*.25=4. Cuando es mas cuerdo y rápido 2*2.

2)

La empresa equis quería un grid que permitiera cambiar el título de un dbgrid. Asi que como el programador no sabía como dar el efecto, compraban un grid de marca patito o no que lo hiciera, y luego se actualizaba por cada cambio de Sistema Operativo o compilador.

3)

La empresa equis tenía un buen montón de codigo hecho en clipper, fox o similar, y de repente decidían pasarse a windows. Como Trataban de seguir pensando en «reutilizar el código anterior» y pensar en modo DOS, empezaban a hacer programas que no funcionaban como debían, y era necesario comprar controles que «lobotomizaban» el procesador para que hiciera ciertas cosas o dieran el efecto del anterior , en vez de usar las prestaciones del actual ( ver punto uno )

4)

Hay un sistema interno de mensajería que funciona con DBFS y no ha tenido problemas.Consiste en ABC y un proceso que muestra mensajes no vistos. Algun genio decide lucirse dentro de la empresa, y hace código en Apis que envia de una terminal a otra por winsock QUE NO FUNCIONAN DE UN SISTEMA OPERATIVO A OTRO ( y a veces en distintas máquinas con el mismo SO tampoco), que mejora el rendimiento en veinticinco diezmilesimas, y quita todo lo anterior. Pero además ya no guarda los mensajes para referencia. Este ejemplo en particular es terrible por lo frecuente, y muchos creen que eso es ser buen programador, cuando lo que debió hacerse es pasarlo a ADO o instalar ICQ.

Reutilizar código solo cuando vale la pena hacerlo

La solución por lo general en todos los casos es cambiar el enfoque de pensamiento. Muchos sabemos que el proceso de un negocio es básicamente general, tienen deudores, cuentas por pagar, pedidos, etc, y son unos cuantos los procesos que cambian. La llamada standarización es sentido común, y sobre todo aquellos que trataban de cambiar de clipper a VB, cayeron mucho en la trampa de olvidarse que estaban programando en Visual.

A principios del 98 realicé un sistema en Vb versión 5, con OCX y DAO/SQL, de otro sistema de Clipper-ASM-C MUY grande, también hecho por mí. Lo que hice fue tomar los menús, una descripcion de los procesos y reportes ( sin mirar el código, eh ? ) , y el 90% era simple ABC, mas uno que otro proceso especial que correspondía al giro de la empresa. Me tomó tres meses dejar funcionando TODO en multiusuario, porque ABC estaba a los ocho dias. Fueron dos meses y medio de portar los procesos específicos del giro de clipper a VB.

Ahora bien, poco después por azares del destino y con el sistema VB funcionando en paralelo, se contrató a Coopers and Lybrand para hacer un análisis, pero sobre el sistema de clipper. Recibí la orden de desechar el sistema de VB que ya tenía instalado en paralelo en varias plantas y regresar al anterior. Lo hice. Se contrató a dos programadores VB altamente rotativos ( solo uno quedo de planta y otro lo rescataron del despido despues de haber pasado por tres o cuatro ) y llegué a recibir Memorandums en que se me preguntaba «Explique por favor para que sirve la orden PADR que usa en su código y donde tiene definido el código fuente, sin mas por el momento quedo de usted».

Para los que no manejen Clipper, los programadores VB querían que les explicara el código de una función interna de Clipper, mas o menos como si alguien me pidiera el código fuente de Form1.Show.

A los dos años apenas estaban empezando a liberar la nueva versión de VB, porque se estaba tratando de portar Clipper a VB, en vez de hacer VB. Y además estaban usando RDO.

Lo que SI se debe hacer con los controles

Los controles OCX evitan esta situación permitiendo utilizar código entre lenguajes y proyectos, lo que puede ser bueno si el código esta bien hecho, o espantoso si pasamos todos los errores de diseño TAMBIEN al otro Lenguaje, o al otro proyecto. Como dije en otro correo hablando de RAD, se trata de hacer las cosas simples y eficientes, y utilizar controles que no podemos ver el código tiene problemas, sobre todo si fueron hechas por otras empresas.

Los Controles nos dan desempeño si no nos casamos con tecnología sino con diseño y sentido común.

En el lenguaje que sea programar ABC es rápido, pero portar del lenguaje que sea al que sea, es lento. A mi me tocó en un momento dado, tener ocho programas diferentes en la misma empresa pero diferentes plantas, en tres versiones cada uno y a veces mas. Clipper, Clipper Gráfico, Visual Objects, Visual Basic. Pero todos usaban los mismos datos. El resultado de esto es…

Tengan una sola versión funcionando que use los mismos datos. Quiere reutilizar el código propio ? Vale la pena si vale la pena. O es un control Ponfoco.ocx ?

Y esto es solo sentido comun, para nada estamos hablando de ser avanzados.

Para poder ser claro, es necesario usar la navaja de Occam y hacer las cosas mas sencillas posibles. En lo personal no recomiendo usar OCX externos, prefiero que me paguen a mi lo que cuesta el control, y estar seguro que no tiene a su vez funciones destructivas. Casi no conozco empresas que garanticen su OCX, o si?

El control darakan OCX que veremos mas adelante, es un control que empezaron a usar varios programadores de una empresa y estaba volviendose el standard, y resultó tan práctico que lo usan ahora varios de ustedes, lo uso yo en proyectos por fuera, y sin embargo.. los programadores «RDO» con «SQL de alto desempeño» signifique lo que signifique, han olvidado que el poder de cualquier lenguaje está en el programador, pero eso no significa dejar de lado ICQ para programarlo por Winsock.

Quizá sea mas facil hacer algo en VB que en ensamblador. Pero son las técnicas lo que diferencian al buen programador del malo, no el lenguaje o los medios que utilice.

Si ustedes ven de repente un programa abierto con 12 indices en clipper o El SAE de Aspel, por ejemplo, no es simbolo de buen trabajo, me explico?

Y Con los controles OCX, que se van creando para el propio uso, hay cosas que pueden usarse en lenguaje C, VB, Visual Objects, y que no se tienen que mover en tres años; que se actualizan perfectamente bien con win2000 o w95, con Access o con SQL-MSDE.

El secreto de los controles es la reutilización del código, pero si tratamos de integrar de Fortran a Visual Basic, o de clipper a Visual Basic, solo debemos hacerlo en lo que NO es ABC o RAD. Los que trabajan en ventas por ejemplo, solo tendrían que rehacer desde cero o reutilizando, el proceso de liquidaciones. Los de las empresas de molinos, el proceso de básculas, las de multinivel las comisiones.

Los procesos generales deben hacerse de manera general y RAD, siguiendo el standard, y el standard es Windows, mal que les pese a algunos, y no nuestros programas. Pero usar Windows No es obligación de usar Apis para saber que 2*2*2/2=4.

Como dice la firma de una persona de una lista de VB..

«No subestime la capacidad de un lenguaje
de programación, el poder está más en la
lógica del programador que en las facilidades
que brinde la herramienta»

Las ultimas semanas he estado notando inestabilidades del browser conocido como chrome o chromium, específicamente en sitios que sirven subconjuntos de java o LJS. (http://www.google.com/#sclient=psy&hl=es&source=hp&q=ljs+java&aq=f&aqi=&aql=&oq=&pbx=1&bav=on.2,or.r_gc.r_pw.&fp=5e1f10055c27afe0)

Uno de los paneles de control de dominios que uso, HSPHERE, tiene una sección mas o menos amplia de control de cuentas, que tiene bastante LJS.

Aunque los problemas de caché de chromium es algo de lo que hablaré después, El origen del problema de momento es por el uso de LJS o java cuando no es necesario.

Vamos por partes:

Javascript muestra información en la computadora del usuario, y no realiza cambios en el servidor.

Los lenguajes como Php, realizan algo en el servidor, y después muestran los resultados en la computadora.

Esto significa que Php carga/cambia cada vez la página , y javascript muestra algo que se cargó una sola vez.

Ajax es una tecnología / metodología que permiite hacer algo en java y pasarlo al servidor. Pero muy pocos sitios avisan si algo no paso al server. Así que podemos ver un «editor» java, donde se capturó datos de un producto o cliente, que se ven como guardados, pero que realmente no existen en el servidor.

Para evitar la recarga de archivos servicios como yahoo han estado sirviendo desde cachés hasta LJS y estandares JSON en lugar de XML. Si bien creo que XML no es seguro, es mucho mejor que JSON.

La principal limitación de JSON es la obligación de hacer un parser adicional (porque no identifica elementos), y si NO sabes hacer un parser como Dios manda, probablemente se acaba ejecutando un eval sobre el conjunto de datos. Resultado, JSON es absolutamente inseguro , o tu haces tu parser espcializado. Si bien el volumen de datos es mas pequeño, es mas ambiguo, hay unos ejemplos claros en http://es.wikipedia.org/wiki/JSON

La mayoría de los servicios JSON o XML que he visto no regresan una hora en formato UTC o de cualquier tipo, asi que no estás seguro si estas viendo o no resultados en caché.

El problema es que muchos grandes proveedores de servicios, están haciendo con JSON los que les da la gana. Hay diversos artículos acerca de como hacer crossforge con JSON (por el problema de rutas predecibles), pero lo que regresan muchos idiotas es «ese JSON está mal implementado porque permite objetos», y no conocen el estandard que dice

http://tools.ietf.org/html/rfc4627

Extracto:
JSON can represent four primitive types (strings, numbers, booleans,
and null) and two structured types (objects and arrays).

A string is a sequence of zero or more Unicode characters [UNICODE].

The terms «object» and «array» come from the conventions of
JavaScript.

JSON’s design goals were for it to be minimal, portable, textual, and
a subset of JavaScript.

Lo cual significa que tienes dos o tres entradas de datos que no autentifican nada, no guardan nada en server (al ser javascript), o de plano te limitas a un absurdo límite sin objetos de java, que ya no es JSON sino un XML mal diseñado, que no tiene validadores en línea y sin XSLTs.

Creo que a mediano plazo, todas las aplicaciones de seguridad caerán en un modelo mas «xml-rpc», de autentificación pero JSON será para mi un riesgo de seguridad. El colegio que he mencionado antes, tuvo el viernes un problema bastante extraño por unos cachés, que de entrada hubieran llevado a pérdida de datos o respuestas parciales.

Asi que, la solución a corto plazo es:
1 ) Evitar usar jquery
2 ) usar bitácoras via APACHE o similares.
3 ) No usar JSON excepto si XML o XML-rpc no son viables.

La real sería eliminar LJS completammente, o su evaluación de Objetos. El eval es quizá el problema de seguridad mas grande del diseño online, y aunque ne php podemos prohibirlo en nuestro servidor, como el java es por pc, puede hacerse lo que le de la gana… y ser diferente a lo que está en nuestro servidor.

Y en la mayoria de los casos Es mucho mejor usar un FTP o un XML-RPC que JSON.

O que de plano le quiten el manejo de objetos, creo yo.

Una nota de sentido común: No necesariamente lo que tiene precio no es gratuito.

He seguido viendo problemas varios en el trabajo por la migración a Linux, y supongo que los problemas provocados por Skype en Ubuntu Nerval van a ser peor.

Explico el contexto:
Como parte de las políticas de uso, y porque varias implementaciones las están haciendo in site, y uno de los «programadores de formatos» (angel) está ahora escribiendo desde otro estado, en el trabajo requieren conectividad con varios de ellos. Ya tuvimos un problema cuando alguien se le ocurrió dar los skypes a todos los clientes.

El caso es que deben usar skype para comunicarse con clientes. Ayer tuve un problema con el nuevo ubuntu 11.04, ya que no instala bien desde el apt-get a menos que uses primero un repositorio de Maverick (ubuntu 10.10). Si bien la solución evidente es usar jabber, nuestras políticas de seguridad lo impiden.

Así que , tuve que permitir el uso de repositorio de Maverick, en una de las pc.

Por cuestiones del personal nuevo, llevo un mes usando mi laptop propia dell inspiron 1525, y se supone que en unos días reponen mi laptop toshiba, aunque a esa le pondré mint o algún slackware.

De las 4 pc que tengo, la dell tiene de momento xp downgrade de vista , la mini hp traer windows7 starter, la lg del disco duro dañado ubuntu 11.04 y la desktop de 23 pulgadas windows 7 home premium.

No faltará el que diga que «usa linux por tal tal tal».

Es una herramienta. Lo que sé es que todas vienen con sistema operativo incluido y una de las razones de usar monitor de 23 pulgadas en mi desktop de la casa es para poder cargar maquinas virtuales de debian al mismo tiempo que uso los programas de windows que necesitamos por dependencias oficiales.

http://h10010.www1.hp.com/wwpc/es/es/sm/WF06b/382087-382087-64283-3181048-3181048-4184767-4173677.html

Un problema de principios… y de sentido común. Si bien la dell tiene dual boot con slackware, no tiene caso cambiar de sistema operativo al ubuntu reciente en las live usb que uso, sobre todo considerando el problema de skype en instalaciones limpias que no tienen las dependencias de maverick establecidas.

Es decir, es extraño que si instalo skype desde un paquete de versión bajado hace dos o otres meses si se instala en nerval, pero en instalaciones limpias, como máquinas virtuales remotas, por lo general no se tiene acceso a bajar paquetes , y el hecho que el paquete de skype esté roto, no implica que lo mejor sea buscar paquete viejo o ubuntu viejo. Si las pc ya vienen con licencia de windows, y el problema es skype, es una estupidez cambiar a linux, sobre todo considerando que hay paquetes de solo windows, y que las reinstalaciones como las de la HP que me pasaron hace una semanas para revisarla no tienen discos de instalación correctos.

Un efecto secundario mas de hacer lo simple. Cuando a mediados de año pasado coincidió la enésima falla de fuente de poder de la pc armada con la necesidad de un monitor de 23 pulgadas, me resultó mejor comprar la desktop de hp. Y quitarle windows puede ser poético, pero es estúpido.

En el medio que me muevo, de programación, servidores, seguridad y cosas web, el tiempo de respuesta es algo buscado pero que pocas veces obtiene uno de ciertos individuos.

Por ejemplo, de momento tengo detenidos cuatro proyectos porque he hecho lo posible con el material que me han dado.

Hace una media hora, despues de una cuidadosa selección de un bien necesario de licencia de un shareware, lo compré. Esperaba yo recibir un software de tipo digital, hice mi proceso y el intercambio se terminó en menos de 15 minutos, sin ser automatizado.

Ojalá Amazon, Barnes and Nobles y otros sistemas de cobro de bienes digitales fueran tan directos.

Lo malo es que es un producto Unico de esa empresa, así que los tiempos no se volverán a repetir, con ellos al menos.

Me reporta hoy uno de los programadores nuevos un problema con el sistema anticopia del sistema que hice hace casi ocho meses y que desde hace cinco meses revisa otra unidad.

Cambiaron la pantalla de login interna por una externa con photoshop, pero al accesar al certificado via direccion ip, no entra porque se compró a nombre del dominio.

Todo esto porque a alguien se le ocurrió hacer una redirección de puertos a través de las máquinas virtuales.

Tuve que comentar el código antiinyeccciones que evitaba malos referer, y deje este comentario en el código:
=========
El proceso de bloqueo de inyeccion SQL queda desconfigurado por que se supone, por ser https, que usamos DOMINIO.
Cuando usamos direccion ip, parece que es inyeccion , porque una ip no puede correr bajo https AOA deshabilita el sistema de inyeccion de referers, cambiando la condicion a 1<>1 el 18 abr 2011,
basicamente porque la direccion ip desvirtua la llamada normal de posts, y el referrer solo funcionaba por dominio, no por ip. Hacer una regla que considere tanto ip como dominios (www), seria redundante porque estamos hablando de https. Asi que, la decisión tomada por terceras personas de llamar a direccion ip fija, deja de lado a fuerza la validacion de puerto 443, porque entra por 80. Y si lo están corriendo por direccion fija, desde firefox (linux), solo pueden entrar por excepcion autorizada de
seguridad, asi que, de entrada no se respetan los criterios de seguridad.

A opinion de AOA, este puede ser un punto de inyeccion SQL. Es responsabilidad de otro checarlo.

Solución real: no redirects. La pantalla que pide el login deberia ser parte de este código, no el añadido, que deshabilitó la original ya incluida en este archivo. El problema tiene origen estético, y DESCONOZCO como llaman o entran desde maquinas virtuales. AOA 18 ABR 2011.

Una de las consecuencias del proceso de borrado del buzón de 460 mil (334 mil al momento )ha sido acordarme de tiempos pasados en tecnología. Cuando trabajé en supermercados por el 95, recuerdo que lo normal era usar MOSAIC y trumpet para ver el correo.

En este momento el problema son herramientas de monitoreo de servidores de dominios web, que sean mainstream, soportados por proveedores con mas de cinco años de experiencia, que soporten clusters (necesidades propias y del trabajo).

Los paneles de control como webmin, software libre, no son soportados y no cumplen las necesidades de cluster ni permanencia del trabajo, lo que me limita a hsphere, ccpanel, plesk, ensim, helm y direct admin.

Sin embargo, en cosas mas modernas me puse a buscar en el API de Cpanel (porque la asociación de marras está en un sitio bajo cpanel del que no tengo acceso como root) si existía una función para borrarel contenido de una cuenta de correo primaria (es decir, la automática, si no fuera esa con borrarla y recrearla).

Al final me puse a verificar el método simple de Fetch por CURL que he usado desde hace años para comprobar los contenidos de los diferentes servers/clusters bajo cpanel que he manejado. Si bien de momento tengo dos servers cpanel de los que soy admin, mas los dos del trabajo, creo que el poder de cpanel depende de otra cosa.

Básicamente, me interesa una API para paneles de control que me de informaciòn estadistica sobre cuentas de correo y bases de datos,asi como uso actual y disponible de disco y ancho de banda.

Un punto secundario es que las funciones de API de cpanel bajo Hash y no password lo hacen mejor que otros paneles para sistemas automatizados de verificación. Las Apis de Hsphere no están expuestas por los tres proveedores principales, y de todos modos los tres proveedores dan tan buen servicio que sale sobrando.

Sin embargo, algo esta extraño con Cpanel.

Por principio de cuentas, en el caso de un macrositio (con trafico a lo bestia) parte de las pymes, consume muchisimo ancho de banda, que a su vez no lo harían recomendable para un cluster.

Si hablamos de un dominio que consume de 100 a 120 gb de ancho de banda al mes, por le principio del 30% de repartición de recursos de los clusters, sale mas barato un servidor dedicado para el dominio en sí, que contratar el cluster del tamaño en sí.

Asi que eso me obliga a por lo menos, tener un servidor dedicado para los sitios dedicados cuyo conjunto de clientes usa demasiado ancho de banda. Por ejemplo, hace unos años tuve bajo CPANEL que administrar los sitios de una agencia de publicidad, que por separado manejaban un manejable 8 a 10 gb por sitio de ancho de banda, pero eran 12 sitios, lo que daba un consumo promedio de 120 gb, lo que para fines prácticos los volvía un macrositio. (offtopic, de todos modos se pasaron a hsphere y reduje su costo a la mitad )

De entrada, un sitio solitario, de un macrositio, en una instalación «limpia», (sin estadisticas ni respaldos) probablemente iría bien bajo direct admin o bajo cpanel con lightspeed.

Plesk es pesado, y cobran por dominio (y su api es muuuy rudimentaria). Los quebraderos de cabeza bajo un cluster plesk deben ser predecibles, y en lo personal por su medio infame de respaldos, solo los usaría para clientes que usen archivos .war, pero dejé de manejarlo hace unos tres años.

Helm solo sirve para ASP especializado y no tiene api para helm3 porque todo se hace bajo objetos com o activex. El control y la apariencia eran bonitos, pero después de las dos catástrofes ajenas que tuve que migrar a cpanel hace unos años, no gracias. Ni mis clientes, ni mis dominios donados los voy a poner en riesgo. La api de helm4 https://www.dcontrol.net/serviceapi/httpapi.aspx no se ve mal, pero no tiene funciones para retrieve de bases de datos, asi que , tampoco sirve para mis necesidades.

Repito, Básicamente, me interesa una API para paneles de control que me de informaciòn estadistica sobre cuentas de correo y bases de datos,asi como uso actual y disponible de disco y ancho de banda.

Ensim ahora es parallels pro, que no uso porque ensim no era fiable (desde el 2007), y su api tambien se ve limitada.

Esto me deja en la obligación de usar de monitoreo, a fuerzas, cpanel. Y además, hsphere sale el segundo candidato natural, porque complementa uno de los puntos debiles de cpanel en cuanto a sitios estáticos.

(tema para hablar otro día)

El trabajo del jueves al viernes quedó bien y la interfaz RVM es funcional. Sin embargo, los cambios de los ultimos días en el corporativo me muestran un problema en ciernes y no mio. El dia de hoy los dos programadores nuevos, que a la hora de la hora contrataron sinseguir el procedimiento que yo fijé en agosto/septiembre, están teniendo problemas. Uno de ellos es mas bien becario que programador y no vino hoy (2do dia en una semanas ?) Y el que se ve mas prometedor, pidió permiso. Por lo que se no le hicieron exámen de programación, solo entrevista (y las notas que vi le pusieron medio).

Es una consecuencia lógica de no pasar sufiiente tiempo haciendo la selección de personal. Los dos que contraté el año pasado me tardé casi un mes , y fueron los mas decentes.. pero la rapidez en la contratación en labores especializadas, es contraproducente. Afortunadamente no laboran directamente en la empresa en que estoy, pero la presión sobre el programador que queda en esa empresa, va a ser mayor y va a estar mas propenso a errores.

Paciencia y esperar.

Los 460 mil mensajes se han reducido a 420 mil. Por cuestiones de load no puedo usar scripts pesados de telnet ni de php, asi que estoy usando un método seguro pero lento. Cada paso elimino unos mil y dura 10 minutos cada paso pero es recuperable a fallos.

En cuanto a los servidores, de momento me encuentro con dos servidores cpanel, mas tres clusters que desaparecerán a dos. Me doy cuenta que hay problemas no solamente delconsumo de ancho de banda de algunas personas a las que dono espacio (que impiden un cluster), sino que algo esta mal con mayúsculas en la economía mexicana y rotación de personal. Por lo general C-P hacía su pago puntual (simbólico) pero en esta ocasión, no. Uno de los clientes fuertes de la PYME mas antigua ha cambiado a su personal de sistemas unas tres veces en el último año, y ninguno contesta lo evidente.

¿Quien está comprando los productos?

Los supermercados (SAMS, bodega aurrerà, comercial mexicana etc) que voy mas o menos frecuentemente, muestran una cantidad tremenda de espacios muertos no importando el día de la semana, así que si hago caso a los comunicados de AMECE sobre ventas y desplazamiento, se sigue vendiendo igual, pero el espacio muerto me lleva a la conclusión que se vende igual en dinero pero menos articulaje.

A su vez, por los cambios en la certificación del corporativo, y su relación con secretarías de estado, nos es materialmente imposible tener nuevos clientes hasta que salgan los nuevos parámetros, pero sè que los productos que manejan las PYMES propias o de las que soy apoderado legal, funciona. Sin embargo, las opciones relativas a servidores web y su consolidación tienen cierta relación y nada que ver con espacios muertos.

Tendré que echar números el fin de semana y un pronóstico de entradas, ya que debe quedar repartida la carga entre las PYMES.

He comentado que hace poco mas de seis meses recibí una llamada del corporativo donde estoy en este momento. Hay acuerdos pesaditos de Confidencialidad (mismos que yo escribí y fui el primero en firmar), pero a veces me pregunto si pasa con el conocimiento esotérico lo mismo que con los RVM (http://en.wikipedia.org/wiki/Relevance_vector_machine), en pocas palabras, si tienen métodos de auto corrección por relevancia iterativa .

Esta noche me espera una buena desvelada. He estado haciendo a ratos un módulo de RVM en php usando XMLRPC pero para que los clientes sean terceras personas. Ya hice el cliente en menos de cuatro horas el lunes o martes ignorando lo que hizo el programador jefe de otra unidad, mismo que me hizo perder dos días haciendo algo no funcional.

Reviisando con otra tercera unidad (donde estàn Aidee y jaime) ellos no tuvieron problema al leer el cliente.

El problema es que uno de los socios se comprometió a regresar información valida de una base datos (que no existe ni esta diseñada en este momento), con datos estadísticos de muestra, para servir a seis procesos XML-RPC. Lo que me obliga a desvelarme para tener para mañana tanto la estructura de la base de datos,como datos de ejemplo, asi como seis receptores de método (no complicado porque ya está), pero además automatizar un método de respuesta por cada receptor.

En la práctica implicaa hacer seis métodos que cada uno haga inserción y consulta a la base, así como una bitacora e interacción con la base de datos final.

Afortunadamente pude elegir y me aprobaron usar INNO.

Creo que lo mas trabajoso va a ser el parser para interpretar las respuestas sin usar clases como la que pasó el jefe de unidad mencionado. Espero tenerlo a la una de la mañana, pero no se si me voy por un ejemplo de array simple, o simpleXML.

Es cuestión de pensarlo.

Mientras, tengo que hacer pausa para ir al baño, y media hora para hacer el esquema mental antes de ir a la escuela por mis hijos.