Hacer un trim en Javascript con Regular expressions

Cómo hacer un trim en javascript de manera «elegante» usando regular expressions:

function trim(s){
s = s.replace(/\s+/gi, ‘ ‘); //sacar espacios repetidos dejando solo uno
s = s.replace(/^\s+|\s+$/gi, »); //sacar espacios blanco principio y final

return s;
}

Pasos para crear un zip en java sin guardarlo en un directorio temporal

-Crear un ZipOutputStream que referencia el destino. En el ByteArrayOutputStream se guardará el zip temporalmente.
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ZipOutputStream zip = new ZipOutputStream(baos);


-Crear un InputStream (o derivado) que referencia un archivo a agregar al ZIP. En el EmbeddedObject se guarda el archivo que se quiere añadir al zip.
EmbeddedObject obj;
InputStream is = obj.getInputStream();


-Crear una ZipEntry que representa el InputStream. Al ZipEntry se le pasa el nombre como se quiere que se llame el fichero que se añadirá al zip.
zipEntry = new ZipEntry(«12354.xls»);

-Agregar el ZipEntry al ZipOutputStream llamando a su método putNextEntry().
zip.putNextEntry(zipEntry);

-Copiar datos del InputStream al ZipOutputStream (usando un buffer array de bytes para leer desde el InputStream y luego escribirlo en el ZipOutputStream).
byte[] buffer = new byte[2048];
int byteCount;
while (-1 != (byteCount = is.read(buffer))) {
zip.write(buffer, 0, byteCount);
}


-Cerrar la entrada zip actual y el InputStream para escribir la siguiente entrada al ZipOutputStream.
zip.closeEntry();
is.close();

-Al añadir todos los ficheros al zip, cerrar el ZipOutputStream.
zip.close();

¿Donde están los ingenieros de software del mañana?

«En Slashdot publicaron una noticia sobre un artículo escrito por Robert B.K. Dewar y Edmond Schonberg, dos profesores de Ingeniería Informática de la Universidad de Nueva York: «Educación de Ciencias de la Computación: ¿Dónde están los ingenieros de software del mañana?». En ella, apuntan a Java como «dañino» en el aprendizaje de la programación, así como critican a las universidades por no enseñar lenguajes sólidos como C, C++, Lisp y Ada. El artículo se reflejó en varios sitios, y parece un verdadero referente del estado actual de la educación formal en Ciencias de la Computación (o Informática). Como estudiante, recomiendo a todos aquellos que estén estudiando programación (o similar) leerlo. En su mayoría, este post es una traducción libre resumida de dicho artículo, así como opiniones y reflexiones personales agregadas.» En general, creo que enumera bien las tendencias más preocupantes en la enseñanza de ingeniería informática (menor énfasis en los fundamentos de programación, abuso de las «recetas» empaquetadas, menor énfasis en matemáticas y lógica, etc.), aunque es obvio que son más acusados en unas universidades que en otras.

DJ Project, integración de navegadores web y reproductores flash en aplicaciones Swing

DJ Project es un proyecto libre que proporciona herramientas y librerías para apoyar el desarrollo de aplicaciones de escritorio Java. DJ Project – Native Swing es una parte del anterior proyecto que pretende facilitar la integración de componentes nativos en aplicaciones Swing, especialmente la integración de navegadores web y reproductores de Flash. DJ Project Native Swing trata de proporcionar un API para los componentes nativos similar a las API que suelen proporcionar los componentes Swing y, según los creadores, resuelve de un modo transparente para el programador todos los problemas relacionados con multithreading. Nuevamente según los creadores del proyecto, éste es uno de sus puntos fuertes respecto al componente JDIC Browser de Swing Labs.Aquí podéis ver unas capturas de pantalla y aquí podéis lanzar una demo (sólo para Windows de 32 bits) del proyecto.

¿Cuántos os habéis visto en la necesidad de integrar un componente nativo en una aplicación de escrtorio? ¿Qué solución usastéis para ello?

Actualización 1.4.1 de openSwing, framework libre para el desarollo de aplicaciones swing Java

OpenSwing es un framework para el desarrollo de aplicaciones swing, tanto para aquellas que no se comunican con una base de datos como para aquellas aplicaciones de dos o tres capas cuyo front end es una aplicación de escritorio. El framework incluye un conjunto de componentes gráficos implementados en Swing orientados a la visualización de datos entre los cuales hay componentes para mostrar cantidades de dinero, grids, un componente híbrido entre un árbol y un grid, calendarios, diagramas de Gantt y un largo etcétera.

OpenSwing también cuenta con una librería para el desarrollo de la capa de acceso a datos y (para las aplicaciones de tres capas) la lógica de negocio, así como una librería que se encarga de simplificar la comunicación con el servidor. También cuenta con componentes para visualizar documentos PDF y Excel. El framework se distribuye bajo licencia LGPL y cuenta con abundante documentación entre la cual se incluyen varias aplicaciones de demostración.

Algunos acoplamientos:

Home page: http://oswing.sourceforge.net

Demo: http://oswing.sourceforge.net/demo10/demo10.jnlp

JAllInOne demo: http://www.hostingjava.it/-carniel/jAllInOne.jnlp

HowTo: Trabajar con ficheros desde Oracle

Para el tratamiento de ficheros de texto desde un procedimiento de Oracle, hay que usar las funciones que proporciona el package UTL_FILE.

Más info sobre este package puede obtenerse de:
http://download-uk.oracle.com/docs/cd/B10501_01/appdev.920/a96612/u_file.htm

La relación exacta de funciones y sus parámetros puede obtenerse de:
http://download-uk.oracle.com/docs/cd/B10501_01/appdev.920/a96612/u_file2.htm#1000703

Para trabajar con ficheros, previamente se debe haber creado un «directorio». Un directorio es un objeto lógico que Oracle utiliza como intermediario entre el PL/SQL y el directorio físico.

Sólo los usuarios de sistema pueden crear directorios y conceder derechos al resto de los mortales. Por lo tanto, hay que solicitar a Centro de Información, Administrador si es el caso o sino crearlo con un usuario de sistema, la creación de dicho directorio, con sentencias como estas:

CREATE DIRECTORY DGQ_OFICINES AS ‘\\asf2\public\mi_directorio’;
GRANT READ ON DIRECTORY DGQ_OFICINES TO SIRA;
GRANT WRITE ON DIRECTORY DGQ_OFICINES TO SIRA;
(por supuesto, el usuario Oracle ha de tener acceso a dicho recurso físico, o éste debe tener acceso público)

Después, hay que usar DGQ_OFICINES, en las llamadas de las funciones (por ejemplo, en el FOPEN). Se ha de poner en mayúsculas.

Ejemplo de código que crea un fichero y escribe una línea:

procedure file_test as
ft utl_file.file_type;
begin
ft := utl_file.fopen(‘DGQ_OFICINES’,’test.txt’,’w’,500);
utl_file.put_line(ft,’hola’,false);
utl_file.fclose(ft);
end;

En este caso, este código abre un fichero (lo crea si no existe y lo machaca si existe).
FT es el handle al fichero. Se asigna con FOPEN y se usa en posteriores operaciones.

FOPEN recibe el nombre del directorio, el nombre del fichero, el modo (read, write o append), y el tamaño máximo de linea a escribir o leer del fichero.

PUT_LINE escribe un texto, añadiendo un separador de línea (hay otra función que no lo añade). Finalmente, el fichero se cierra con FCLOSE.

Lotus Script y java con LS2J

Este código pertenece a un agente LotusScript, en el se crea una JAVASESSION y una JAVACLASS. En este ejemplo se obtiene la clase “pruebaJava” y creamos un objeto de la clase, (equivalente a un set c1 = new c1()), los parámetros del CreateObject son los parámetros que recibira el constructor por defecto. (*Ver anexo)

Una vez tenemos la instancia del objeto ya podemos trabajar con el como si de java se tratase.

 

Sub Initialize

                On Error Goto errutina

                Dim js As JAVASESSION

                Dim pruebaJava As JAVACLASS

                Dim pruebaJavaObject As JavaObject

                Dim returnCode As String

                Dim ses As New notesSession                       

                Dim db As NotesDatabase

 

                Set js = New JAVASESSION

                Set pruebaJava = js.GetClass(«pruebaJava»)

                Set pruebaJavaObject = pruebaJava.CreateObject(«(ILjava/lang/String;)V»,10,”ELOY”)

                Set db = ses.CurrentDatabase         

                Messagebox (“NOMBRE DEFAULT: “ & pruebaJavaObject.getNombre())

                pruebaJavaObject.nombre = «ELOY RODRIGUEZ»    

                Messagebox («VARIABLE NOMBRE: » & pruebaJavaObject.nombre &_

 » METODO getNombre(): » & pruebaJavaObject.getNombre())

                pruebajavaObject.push(2)

                pruebajavaObject.push(5)

                pruebajavaObject.push(12)

                pruebajavaObject.push(34)              

                Msgbox pruebajavaobject.getStringCajas()

                Dim a As Variant

                a =  pruebaJavaObject.getArrayCajas()         

               Msgbox Lbound(a) & » – » & Ubound(a)

                Dim i As Integer

                For i = 0 To Ubound(a)

                               Msgbox a(i)

                Next       

                Exit Sub

errutina:

                Msgbox «Error in line » & Erl & «: » & Error                 

End Sub

Navega por las fotos de Badongo con esta sencilla página

Código sencillo en Javascript y Html para navegar por las fotos de badongo. Es muy sencilla, sin ningún css de estilo que lo dejo a gusto de cada uno. Solo contiene lo minimo. Para hacerla servir crear un archivo html con este código.

<html>
<head>
<meta http-equiv=»Content-Type» content=»text/html; charset=UTF-8″>

<script type=»text/javascript»>

var i;

function nextImage(){

document.getElementById(«ibadongo»).src=»http://www.badongo.com/pix/» + i;

i++;
document.getElementById(«numimage»).value = i;

}

function prevImage(){

document.getElementById(«ibadongo»).src=»http://www.badongo.com/pix/» + i;

i–;
document.getElementById(«numimage»).value = i;

}

function randomImage(){

random(3000000);
document.getElementById(«ibadongo»).src=»http://www.badongo.com/pix/» + i;
document.getElementById(«numimage»).value = i;

}

function loadPage(){

random(3000000);
document.getElementById(«ibadongo»).src=»http://www.badongo.com/pix/» + i;

document.getElementById(«numimage»).value = i;

}

function random(num){

i = Math.round(num*Math.random())

}
function nav2image(){

i=document.getElementById(«numimage»).value
document.getElementById(«ibadongo»).src=»http://www.badongo.com/pix/» + i;
document.getElementById(«numimage»).value = i;

}

</script>

</head>
<body onload=»loadPage();»>
<input id=»btn_prev» type=»button» value=»Previo» name=»btn_previo» onclick=»prevImage();» />
<input id=»btn_next» type=»button» value=»Siguiente» name=»btn_next» onclick=»nextImage();» />
<input id=»btn_random» type=»button» value=»Random» name=»btn_next» onclick=»randomImage();» />
<input type=»text» id=»numimage» name=»numimage» value=»1″ /><input type=»submit» value=»Buscar» onclick=»nav2image();» />
<br>
<iframe id=»ibadongo» width=»1024″ height=»700″ name=»ibadongo»></iframe>
</body>
</html>

Esta página esta hecha con Geany, editor de textos GNU, desde linux Ubuntu 7.10

Benchmark de javascript en navegadores

Jeff Atwood de Coding Horror ha realizado un benchmark de la implementación de javascript de las últimas versiones de los navegadores más usados actualmente: Opera 9.5, Safari 3, Explorer 7 y Firefox 2. Para ello utilizó un nuevo benchmark lanzado por Apple llamado SunSpider que se basa en código «real» o sea código que normalmente es usado en aplicaciones web, las diferentes categorías que cubre son:

3d Cómputo que se usaría para renderizar 3d, como operaciones de punto flotante.
accesso Acceso a arrays, propiedades de objetos y a variables
bitops Operaciones bitwise
Control de flujo Bucles, recursividad, condicionales.
criptografía Código para funciones criptográficas.
fecha Desempeño del objeto «Date»
Matemáticas Cálculos matemáticos
regexp RExpresiones regulares
string Operaciones con cadenas de caracteres

Como podrás ver en los resultados del benchmark, Opera tuvo el mejor desempeño pero como indica Jeff tuvo que usar la última beta del navegador para que todo el benchmark funcionara correctamente. Le sigue Safari, un gran resultado considerando que las pruebas se hicieron sobre el SO Windows, seguramente sobre mac OSX sus números incluso mejorarían. El tercer lugar sería para Firefox 2, pero eso gracias a una anomalía de Explorer en las operaciones con Strings, de no ser por eso, Explorer gana por bastante margen al navegador de Mozilla.

En un mundo en que cada vez se usa más javascript, este tipo de benchmark empiezan a tener sentido. Lo de Firefox es una llamada de atención al equipo de desarrollo, resulta increible que es prácticamente el browser más lento en javascript. Sería interesante ejecutar el benchmark sobre Firefox 3 beta 2.

Gráfico de la comparativa

Manual de codificación y estilo para programadores

El manual trata toda clase de aspectos relacionados con el código en forma de «catálogo de buenas prácticas » – desde nombres de identificadores hasta control de flujo, pasando por recomendaciones sobre trazas, codificación de pruebas unitarias o modelo de datos. No pretende sustituir, claro está, una lectura de los libros pertinentes (se incluye una amplia bibliografía), pero reconociendo que muchas veces no hay mucho tiempo para leer y que la rotación de programadores es muy grande, intenta paliar esta carencia resumiendo lo mejor de las diferentes fuentes, a modo de solcuión «temporal».

El manual se encuentra ubicado aquí y espero poder actualizarlo con los comentarios y sugerencias que reciba. (Formato : PDF, 86 páginas, 1,05 Mb)