Mostrando las entradas con la etiqueta programación. Mostrar todas las entradas
Mostrando las entradas con la etiqueta programación. Mostrar todas las entradas

lunes, agosto 27, 2007

Encriptar páginas: Seguridad o Accesibilidad

¿Vale la pena encriptar una página web?

Muchas veces me he econtrado con desarrolladores quienes me preguntan acerca de cómo encriptar un sitio web, proteger el contenido de una página web o sencillamente si hay algún méodo para evitar que el navegante pueda acceder al código (X)HTML y Javascript del sitio, y siempre les doy la misma respuesta: NO.

Alguno al leer este artículo dirá, pero cómo yo lo he hecho, he ecriptado una página web y nadie puede ver el código fuente, ni copiarlo, ni siquiera seleccionar, copiar y pegar el texto. Aquéllos que estén diciendo esto, pueden enviarme su página y en cuestión de 30 segundos les devolveré el código fuente de la página.

Analicemos el asunto desde otro punto de vista. Digamos que la "encriptación" se ha llevado a cabo. ¿Cree que un buscador como Google podrá leer y acceder a nuestro sitio para agregarlo a su índice? De nuevo la respuesta es NO. Si yo accedo con un navegador que no soporta Javascript ¿es posible ver la página?, otro no a la cuenta. Pero se puede proteger la información y no permitir que solo la puedan ver en navegadores de última generación, la respuesta no es ni positiva ni negativa. Yo personalmente uso Mozilla Firefox, y vaya que es supremamente fácil incluso para un principiante. Tal vez se puede proteger de aquellos que no tienen ni la más remota idea de una página y solo saben navegar

viernes, abril 20, 2007

Top 20: Frases de los programadores

En el Blog “Under the Sun” encontré las 20 respuestas que un programador da a los “testers” o usuarios cuando su programa no funciona. Todas estas frases tan ciertas y dolorosas para los que nos hemos desempeñado como desarrolladores o testers que a veces no nos damos cuenta lo común que se hacen nuestro argot.

Empecemos la cuenta regresiva:

20. “Vaya, qué extraño…”

19. “Eso nunca había pasado antes”

18. “Ayer funcionaba bien”

17. “¿Cómo pudo haber pasado?

16. “Debe ser un problema de hardware”

15. “¿Qué escribió usted que hizo que el programa se bloqueara?”

14. “Tiene que haber algo mal en sus datos”

13. “No he tocado ese módulo en semanas”

12. “Debe estar trabajando con la versión equivocada”

11. “Es sólo una coincidencia desafortunada”

10. “Yo no puedo probarlo todo”

9. “ESTO no puede ser la causa de ESO”

8. “El programa funciona, pero eso no ha sido probado”

7. “Alguien debe haberle metido la mano a mi código”

6. “¿Seguro que no hay un virus en su sistema?”

5. “Aunque no funcione, ¿cómo se siente usándolo?”

4. “No puede usar esa versión en su sistema”

3. “¿Porqué quiere hacerlo de esa manera?”

2. “¿Dónde estaba usted cuando el programa falló?”

1. “En mi máquina funciona bien”

 

Yo agregaría otras al listado:

  • ¿Ya probó reiniciando la aplicación? y ¿ya reinició el PC?
  • ¿Ya intentó reinstalando la aplicación?
  • El CD debe haber quedado mal quemado
  • Debió haberse descargado mal.
  • ¿Acaso no debía funcionar así?
  • Eso no es un error, así es como funciona.
  • Ese es un error de un componente del Framework.
  • ¿Ya instaló la actualización de seguridad de su sistema?
  • Mínimo el repositorio se dañó.
  • Funciona, pero debo corregirlo.
  • No hubo tiempo para terminar eso.
  • Eso no está en los requerimientos.
  • Se hizo por cuestiones de seguridad.


Y aquí están las respuestas que neutralizarían el top 10:

10. "No puedo probarlo todo"
Correcto, Por eso encontré el problema.

9. "ESTO no puede ser la causa de ESO."
Sí, sí puede.

8. "Funciona, pero no ha sido probado todavía"
Non sequitur.

7. "Alguien debe haberle metido la mano a mi código"
Entonces por favor, recupérelo.

6. "Ya revisó que no haya virus en su sistema?"
Sí, y muchas veces.

5. "Aun cuando no funciona, cómo se siente usándolo?"
Como si no funcionara.

4. "No puede usar esa versión en su sistema."
Sí, Sí puedo.

3. "Por qué desea hacerlo de esa manera?"
Porque estoy emulando a un usuario que no sabe sistemas quien lo haría de esta manera.

2. "Dónde estaba usted cuando el programa falló?"
En mi oficina, buscando otro error en su código.

1. "Funciona en mi equipo"
No podemos cargar su máquina a todas partes. Esta no es su máquina.

lunes, febrero 27, 2006

Lenguajes interpretados vs Lenguajes Compilados: Desidia, capricho o tendencia.

La eterna batalla a punto de culminar

Varios de los lectores de este blog me han cuestionado mi posición sobre lenguajes como Java, Perl, PHP, Ruby, ASP, y la última suite de Microsoft: Visual Studio.Net. Pues bien, ha llegado el momento de explicar mi posición, la cual puede ofender a muchos, dejar perplejo a otros y confundir al resto, bueno, algunos pocas personas estarán de acuerdo conmigo.
En fin, la pregunta clave es: ¿qué es mejor, el lenguaje interpretado o el lenguaje compilado? Voy a resumirlo en una sola frase. Todos los lenguajes son interpretados.
Ya sé que alguno (si no la mayoría) dirá que eso no es posible, y por lo tanto, haré la sustentación a tal afirmación.
Para empezar, debemos definir cada una de las frases desde el punto de vista programación de PC's.

Lenguaje Compilado
Un lenguaje compilado es término un tanto impreciso para referirse a un lenguaje de programación que típicamente se implementa mediante un compilador. Esto implica que una vez escrito el programa, éste se traduce a partir de su código fuente por medio de un compilador en un archivo ejecutable para una determinada plataforma (por ejemplo Solaris para Sparc, Windows NT para Intel, etc.). (Lenguaje Compilado - Wikipedia)

Lenguaje Interpretado
... Un lenguaje interpretado es aquel en el que las instrucciones se traducen o interpretan una a una en tiempo de ejecución a un lenguaje intermedio o lenguaje máquina o a través de una máquina virtual, siendo típicamente unas 10 veces más lentos que los programas compilados.(Adaptación de la definición en Wikipedia)

Luego de las deficiones, digámoslo en términos cristianos, o mejor en términos informáticos, porque no todos los cristianos entienden esta terminología. Un lenguaje compilado es aquel que, en teoría, es traducido a código máquina y las instrucciones generadas, son interpretadas directamente por la máquina. Y un lenguaje interpretado, es aquel que es traducido a un lenguaje intermedio(entiéndase no-máquina), en la cual cada instrucción es interpretada y traducida a lenguaje máquina en tiempo de ejecución. En la práctica, solo los sistemas operativos y contados programas que se ejecutan especialmente por consola, se encuentran en código máquina. Y antes que alguien interprete mal, explico lo anterior.
Si hablamos de la plataforma más usada en el hogar, entiéndase Micro$oft Windows, o pues hasta el momento de la redacción de esta nota, TODOS, sin excepción, son lenguajes interpretados o semi-interpretados. Aquellos conocedores del lenguaje ensamblador me hallarán la razón sin mayor problema. En los sistemas operativos modernos, cuando se "compila" un programa, éste se traduce a un pseudoensamblador o a un estilo de pseudo-máquina, que a su vez es interpretada por la "máquina virtual" propia o nativa del sistema operativo, para poder procesar, dibujar y ejecutar todas las instrucciones adecuadamente. Los programadores avanzados, sabrán que cuando se compilan los programas, lo que se puede encontrar es una serie de llamados a librerías externas las cuales realizan las tareas solicitadas. En el caso de sistemas operativos tipo UNIX y demás, la cosa no cambia mucho, así que no entro en detalles.
Pero ahora sí entremos en materia. Ya está claro que todos los programas son interpretados en mayor o menor grado, la cuestión es ahora, qué compiladores generan código "más compilado" (valga la aparente redundancia) que los otros. Aquí voy a mezclar un poco concepto personal con concepto técnicos. Para empezar voy a ser directo y mencionaré algunos lenguajes que son los generan, en teoría, programas "más compilados", sin mencionar las plataformas a las cuales pertenecen (hago omisión de algunos lenguajes compilados, no usados en la actualidad: Fortran, Ada, Algol, COBOL y demás de su tiempo, exceptuando BASIC y derivados):
CEl lenguaje compilado maestro por excelencia, excepto en Visual Studio.Net. Solo menciono que es el lenguaje en el cual se diseñaron la gran mayoría, por no decir todos, los sistemas operativos modernos.
C++Alguno se peguntará, el porqué separo C de C++. Pues bien, sucede que C++ no es TAN compilado como C, especialmente porque casi siempre está usado en sistemas operativos gráficos, solo en sus versiones de consola es compilado en código máquina real, pero básicamente y en esencia se compila a código máquina.
PascalBásicamente, en todos sus sabores y colores, es compilado a código nativo máquina
Delphi, Kylix, LazarusSon altamente compilados, aunque no totalmente, pues están orientados a sistemas operativos gráficos, así que en menor grado son interpretados, pero son considerados lenguajes compilados, pues el código generado es nativo de la plataforma objetivo.

He mencionado los más conocidos y más usados, ahora sí vienen los lenguajes interpretados, los cuales causan tanta polémica.
BASICEl lenguaje interpretado por excelencia y hasta donde tengo conocimiento, el más antiguo, aunque no fue interpretado en sus principios, luego se convirtió en el hito de los lenguajes interpretados. Todos sus derivados son en mayor o menor grado interpretados, aunque alguna vez, Borland lanzó un BASIC que se compilaba, en teoría (nunca lo comprobé), a código máquina.
JavaScript, VBScriptAunque más interprestados que este par, creo que no existen, los menciono como para información general.
Perl, PHPEstos lenguajes diseñados para web, son lenguajes interpretados por excelencia, aunque se compilan a código intermedio en tiempo de ejecución, cosa que acelera su ejecución. Existen también herramientas que generan un código cercano a la máquina para estos dos lenguajes y cachean contenido, pero a la larga, siguen siendo interpretados.
Batch, ShellLenguajes interpretados para los OS's, los cuales se ejecutan bastante lento, pero ya que por lo general son tan cortos o realizan tareas tan básicas no es perceptible el rendimiento.
JavaEste lenguaje ha sido bastante diversificado en la actualidad, incluso, varias de las grandes aplicaciones comerciales modernas están diseñadas en este lenguaje, por ejemplo, Zend Studio y Oracle JDeveloper, solo por mencionar dos grandes.
Visual Studio .NETEl Boom de los lenguajes por imposición Micro$oft. NINGÚN programa generado con los lenguajes de esta suite o como se le quiera denominar a este paquete, genera código máquina y de hecho está bastante lejos de ser código máquina, o incluso, referencias a librerías como lo harían otros lenguajes como Delphi, C++, o similares. No estoy en contra de esta nueva metodología para la interpretación de software, pero sí hay una gran desventaja, es la MUY lenta ejecución de los programas generados y en cortas palabras explico el porqué (podría hacer todo un compendio): El lenguaje generado es un código intermedio el cual a su vez se compila en tiempo de ejecución, el cual es interpretado por el Framework de .Net, el cual ejecuta las instrucciones haciendo los llamados respectivos a las librerías del sistema operativo. En mi concepto personal, es demasiada vuelta para ejecutar una simple instrucción con llamado a una API del Sistema Operativo. Aunque la teoría dice que el programa luego de compilarse en tiempo de ejecución, permanece así, por lo tanto es un aumento en la velocidad de ejecución, mejora que he tenido la oportunidad de experimentar, porque código interpretado que ejecute código einterpretado, me temo no es muy veloz que digamos.

Pero, ¿por qué tanta renuencia a estas nuevas tecnologías?, y ¿qué pros y contras presentan?. Es bastante sencillo. No estoy en contra de estas tercnologías, de hecho, son excelentes y tarde o temprano, aunque más temprano que tarde, serán los estándares de compilación y serán considerados como lenguajes compilados.

Ventajas de los lenguajes interpretados

  • Portabilidad: Esta es la principal ventaja que presenta este tipo de lenguajes, porque puede ser compilado en y para cualquier plataforma o sistema operativo.
  • Compatibilidad: al ser interpretado por el sistema operativo, es la máquina virtual o framework el que se encarga de que las intrucciones sean ejecutadas por el software y el hardware.

Desventajas de los lenguajes interpretados

  • Velocidad: Es el aspecto más notable y el cual se debe evaluar a fondo al crear software con este tipo lenguajes, pues se debe equilibrar la portabilidad con la velocidad que se está sacrificando. A menos que las prestaciones de los equipos informáticos sean bastante altas, en el caso cual, se podría despreciar este aspecto.
  • Portabilidad: es una desventaja también. El problema radica en que en la actualidad, asi todos los lenguajes compilados, existen para todas las plataformas, no así las máquinas virtuales o frameworks, aunque en el caso de Java, se ha hecho un excelente trabajo en cuanto a eso y no me puedo quejar, existe para casi todas las plataformas, por no decir todas, actuales. El .NET framework, lamento decir que en la actualidad, se encuentra ciento por ciento probado solo en Windows, aunque existen proyectos que prometen tal portabilidad, aunque todavía no son un hecho.

En conclusión, ¿cómo actuar?. No es muy difícil. Se evalúan los requerimientos, se definen necesidades, si éstas no superan el hardware a usar, perfectamente se puede proseguir, de lo contrario, es mejor pensar en un lenguaje compilado, pues os lenguajes interpretados exigen gran cantidad de recursos especialmente RAM y procesador. Deberían aprovecharse los lenguajes interpretados hasta donde sea posiblem pues en pocos años o incluso meses, entrarán en vigor y serán (¿o son?) el nuevo estándar de desarrollo.

jueves, octubre 13, 2005

Dispárate en un pie y te volarás la cabeza: ¿Qué lenguaje usar?

El dilema de la elección de un lenguaje de programación

Justo antes de iniciar este blog estaba pensando en esa famosa frase que describe a C++:

C te facilita dispararte en el pie. C++ lo hace más difícil, pero cuando lo haces, te vuela la pierna entera. (Bjarne Stroustrup)

Esto a su vez me recuerda un correo electrónico que alguna vez recibí de algún amigo refieriéndose a esta dura decisión, el cual deseo compartir con todos los internautas.

Tarea a Realizar
Dispararse en el pie
LenguajeDescripción
C Te disparas en el pie.
C++ Creas accidentalmente unas docenas de operadores a ti mismo y todos te disparan en el pie.
FORTRAN Te disparas en cada dedo de los pies iterativamente hasta que se te acaben los dedos, entonces READ el NEXT pie y REPEAT. Si se te acabaran las balas, debes continuar con los intentos de disparo, ya que no hay capacidad de manipulación de excepciones.
Pascal El compilador no te permite dispararte en el pie.
Ada: Después empaquetar correctamente el pie, intentas cargar al mismo tiempo el revólver, apretar el gatillo, apuntar y disparate en el pie. Cuando lo intentas descubres que no puedes porque tu pie es del tipo equivocado.
COBOL USING un COLT 45, apunta REVOLVER en PIERNA.PIE, ENTONCES pon BRAZO.MANO.DEDO en COLT.GATILLO, APRIETA y DISPARA. THEN RETURN COLT a CARTUCHERA. CHECK ZAPATO.CORDON si necesita ser atado.
LISP (Te disparas en el apéndice que mantiene el revólver con que ((te disparas en el apéndice que mantiene el revólver con que (((te disparas en el apéndice que mantiene el revólver con que ((((te disparas en el apéndice que mantiene el revólver con que (((((te disparas en el apéndice que mantiene el revólver con que ((((((te disparas en el apéndice (...) ))))))
FORTH El pie se dispara a sí mismo.
Prolog Le dices a tu programa que quieres dispararte en el pie. El programa razona cómo lo hace, pero no entiendes la sintaxis.
BASIC: Dispárate en el pie con una pistola de agua. En sistemas grandes, continúa hasta que el agua cubra el cuerpo entero.
Visual Basic: En realidad sólo parece que te has disparado en el pie, pero te has divertido tanto que realmente no importa si has disparado o no.
Hypertalk: Pon la primera bala de revólver en el pie de la pierna izquierda. Responde el resultado.
Motif Te pasas días escribiendo una descripción UIL de tu pie, de la bala, de su trayectoria y los intrincados dibujos de las cachas de marfil del revólver. Pero cuando te dispones a apretar el gatillo, se atasca el revólver.
APL Te disparas en el pie, pero te pasas todo el día arrepentido pensando que podías haberlo con menos caracteres.
SNOBOL Si tuvieras éxito, dispárate en el pie izquierdo. Si fallara, dispárate en el pie derecho.
Unix % ls pie.c pie.h dedo.o dedo.c dedo.o % rm * .o rm:.o

No existe tal fichero o directorio % ls %

Concurrent Euclid Te disparas sobre cualquier miembro en vez del pie.
370 JCL Debes bajar el pie un MIS e incluir un documento de 400 páginas detallando exactamente cómo lo quieres disparar. Tres años después, tu pie regresa absolutamente frito.
Paradox No solamente puedes dispararte en el pie, tus usuarios también lo hacen.
ACCESS Intentas apuntar el revólver en tu pie, pero terminas por disparar en los agujeros de todos los diskettes de distribución de Borland.
Ensamblador Intentas dispararte en el pie solamente para descubrir que antes debes inventar el revólver, la bala, el gatillo y el pie.
Modula2 Después de comprender que es imposible hacerlo con este lenguaje, te disparas en la cabeza

A pesar de ser un texto burlesco y un tanto jocoso, presenta de manera divertida la realidad de los diferentes lenguajes de programación existentes. Pero entremos a analizar los pros y contras de cada uno de los lenguajes más importantes de la actualidad.

Lenguaje Características
C El lenguaje más poderoso en toda la historia, considerado un lenguaje de no muy alto nivel, y esto mismo le otorga gran parte de la potencia que posee. Es ideal para el desarrollo de programas a bajo nivel, tales como Sistemas Operativos, BIOS, y otros compiladores, ya que los binarios generados son bastante reducidos y optimizados (depende del programador). Además, en teoría, puede interactuar con prácticamente cualquier otro lenguaje de programación, compilador o programa.
C++ Posee toda la potencia del C pero con un valor agregado, la POO, la cual nos permite darle una mayor organización al software, lo que lo convierrte en un excelente lenguaje para el desarrollo de software de alto nivel.
FORTRAN Aunque debo aceptar que no soy un gurú de este lenguaje, cabe decir que este poderoso lenguaje ya casi en desuso, es el ideal para el desarrollo de sistemas científicos, pues toda su estructuración y filosofía lo permiten.
Pascal Mi favorito. Como rezaba alguna una campaña publicitaria de Borland:
Toda la facilidad de BASIC con la potencia de C++

Es un lenguaje altamente didáctico e ideal para la enseñanza, pues es bastante ordenado. Aunque para algunos es una ventaja que este lenguaje tenga tipos de datos estrictos, para esto es bastante molesto, pero no viene al caso debatir sobre este asunto, que puede ser expuesto en otro tema más adelante. Excelente para casi todo.
BASIC Es un lenguaje poco estructurado, poco práctico para el desarrollo de software. No lo recomiendo, y de hecho es prácticamente extinto como tal. Actualmente existen versiones y adaptaciones tales como VisualBASIC en sus diferentes sabores.
VB Como diría alguna vez:
Visual BASIC hace convierte al programador principiante en un verdadero experto y al experto en un completo inútil.
Es muy práctico para el rápido desarrollo de aplicaciones gráficos con interfaces sencillas. Aunque se pueden contruir sistemas bastante "robustos", no es práctico para el desarrollo de aplicaciones realmente potentes, posee demasiadas dependencias que convierten a la aplicación en una máquina para consumir recursos del PC.
Ensamblador El lenguaje más poderoso de todos, poco usado por los programadores en la actualidad, así por el contrario los electrónicos, ya que este lenguaje nos permite manejar el PC al más bajo nivel posible, manipular toda su estructura y programación.
Este lenguaje puede llegar a ser peligroso si no se sabe usar o por el contrario se conoce muy bien. Un ejemplo de esto son los "verdaderos virus", o quién no recuerda al legendario NATAS-BOOT, virus que eran una verdadera obra de arte, gracias a los avanzados conocimientos de este lenguaje que poseía el programador.
Ideal (entiéndase, necesario) para la programación de Sistemas Operativos y compiladores que requieran acceso al PC a bajo nivel.

Aunque habrá podido notar que no he mencionado varios de los lenguajes existentes, lo hago pues estos tal vez son los más conocidos y comerciales. Las diferencias radican en detalles que no vale la pena exponer por ahora.
Pero al final de cuentas, ¿cuál es el mejor lenguaje?.
R./ No hay mejor lenguaje.
¡Pero cómo es posible que no haya uno que sea el mejor!, senciallamente, porque cada lenguaje fue diseñado con un propósito en específico, y aunque en la actualidad muchos lenguajes como Delphi, C#, y VisualBASIC.Net ofrecen grandes facilidades para el desarrollo de sistemas cada uno tiene sus características que lo hace único, además cabe anotar que esto va de acuerdo al estilo de programación que se use.
No quiero inclinar a usar equis o ye lenguaje, pues no es mi propósito, pero para los que desean saber qué lenguaje uso, temo decir que varía según la necesidad, aunque como expuse anteriormente Pascal es mi favorito, debo aceptar que actualmente no lo uso. Por el contrario uso versiones derivadas de éste, como son: Delphi, Kylix, FreePascal, Lazarus, etc. y aun a pesar de todo, ninguno de los anteriores uso a menudo, pues también uso VB en su diferentes presentaciones, según sea la necesidad, Ensamblador, C/C++/C# y otros los cuales no vale la pena mencionar. Así que igualmente le invito a hacer lo mismo, que de seguro le traerá muchas satisfacciones.