Friday, June 08, 2007

Eclipse TIPS

Una página web con buenos tips de eclipse, aquí encontré como eliminar los espacios al final de las líneas en un archivo.

http://www.newt.com/java/eclipse/

Saturday, April 21, 2007

Mylar en Eclipse

Mylar es un proyecto que busca integrar la parte colaborativa en Eclipse, es decir su usa bugzilla ya no tienes que salir del IDE, muchos diran ya plugins para eso si pero ninguno que yo sepa hace task focus (enfoque en tareas) como lo hace Mylar :), así que Mylar no es solo integración es eso y más.

Solo tuve que ver el webinar para decir un WOW :), esta es la contribución a Eclipse más importante después del mismo Eclipse, y es mucho decir ;).

Tienen que darle un ojo a este impresionante plugin, para los que trabajan al estilo de tareas y bugs en Eclipse se sentirán aliviados :)

Tuesday, April 03, 2007

Problemas al ejecutar el task de JUnit de Ant en Eclipse

De seguro muchos como yo han tenido problemas al ejecutar el ant task de junit con eclipse.

<junit fork="true" haltonerror="false">             
<classpath location="${build_testclassdir}" />
<classpath refid="test.build.classpath" />

<test name="${package}.AllTests" todir="${testlogdir}">
<formatter type="plain" usefile="true"/>
<formatter type="xml" usefile="true"/>
</test>

</junit>
El problema esta en que se debe agregar el archivo junit.jar al directorio:
..\plugins\org.apache.ant_1.6.5 de eclipse\junit.jar

Este archivo es la librería de junit la cual debe estar disponible para ejecutar el ant task.

Nota: esto es para eclipse 3.2, no se si las versiones anteriores tienen este problema.

Eclipse subversion - Malformed network data

Bueno en este blog encontré la solución al problema del cliente de subclipse el cual tenia este error cuando se hacia el checkout de un proyecto.

Sunday, April 01, 2007

Video Tutorial de Ajax con Prototype

Un video tutorial hecho por mi :) explicando la creación de un chat utilizando ajax y java, para ajax se utiliza la herramienta archi conocida librería Prototype.




Para poder ver el video en mejor resolusión youtube

Monday, March 26, 2007

Anti-patrones en Ajax

Unos anti-Patrones que donde me incluyo haberlos utilizados para entregar rápido pero que cuestan a la hora de mantener la aplicación.

Cinco Anti-Patrones en Ajax

Rhino: JavaScript for Java

Para implementar la funcionalidad de ejecución de javascript en mi SearchEngine con Agentes de Jade, estuve leyendo un articulo interesante sobre Rhino que es una implementación de Javascript para java que permite scripting en aplicaciones Java. Esto es posible en Java 6 como una nueva característica, ya puedes correr PHP, Ruby, JavaScript, Python (or Jython).

Por cierto, Rhino viene integrado en Java SE 6, por lo tanto si tiene Java SE 6 ya puedes utilizar esta característica.

La características de este puedo mencionar:
  • Compilación de javascript (si quiere compilar en script para un mejor rendimiento)
  • Invocación de funciones.
  • Acceso a recursos de Java (Puedes importar clases de java, invocar métodos y objectos de Java )
  • Y lo más obvio manejo de return del script que ejecutas.
  • Ejecutas el script desde hard code en java (lo cual no tendría mucha diferencia con lo que podrias hacer en java) y ejecución de script almacenado en un archivo.
  • Soporte para la ejecución de PHP, Ruby, JavaScript, Python, etc dentro de Java con las características ya mencionadas. (Imaginate correr PHP en un servidor de Java EE y que puedas acceder desde PHP los objectos de java, javabean, ect.)
The Mustang Meets the Rhino: Scripting in Java 6

Ejemplo:

package org.vnssoftware;

import javax.script.Bindings;
import javax.script.Compilable;
import javax.script.CompiledScript;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class Scripting {
public static void main(String[] args) {
ScriptEngineManager engineManager = new ScriptEngineManager();

ScriptEngine engine = engineManager.getEngineByName("js");

engine.put("age", 21);
try {
engine.put("age", 26);
engine.put("noClaims", Boolean.TRUE);
Object result = engine.eval(
"if (age < 25){ " +
" riskFactor = 1.5;" +
"} else if (noClaims) {" +
" riskFactor = 0.75;" +
"} else {" +
" riskFactor = 1.0;" +
"}");
System.out.println(result);

// using javascript files
//engine.eval(new FileReader("c:/voting.js"));

// importing java classes
engine.eval("importPackage(java.util); " +
"today = new Date(); " +
"print('Today is ' + today);");

// using object instances passed to the script engine, and on static class members.
engine.put("name","John Doe");
engine.eval("name2 = name.toUpperCase();" +
"print('Converted name = ' + name2); \n");

// script engine implementations support script compilation
Compilable compilable = (Compilable) engine;
CompiledScript script = compilable.compile(
"if (age < 25){ " +
" riskFactor = 1.5;" +
"} else if (noClaims) {" +
" riskFactor = 0.75;" +
"} else {" +
" riskFactor = 1.0;" +
"}");

Bindings bindings = engine.createBindings();
bindings.put("age", 26);
bindings.put("noClaims", Boolean.TRUE);
bindings.put("riskFactor", 1);
script.eval();

// call individual functions defined in the script from your Java code.
engine.eval("function increment(i) {return i + 1;}");
Invocable invocable = (Invocable) engine;
Object resul = invocable.invokeFunction("increment", new Object[] {10});
System.out.print("result = " + resul);

} catch (ScriptException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}

}
}

Tuesday, January 09, 2007

En busca de parseadores HTML

Estoy en busca de parseadores HTML para mi spider implementado en Jade,
encontré este HTMLParser, el cual es simple y rápido.

Ahora es más simple obtener el texto de una pagina web y la lista de enlace de esta misma.

Ejemplo:
String URL = "http://htmlparser.sourceforge.net";
StringExtractor se = new StringExtractor (URL);
String contents = se.extractStrings(true);
System.out.println(contents);

Eclipse and Equinox

Este artículo muestra de manera aérea, como funciona la arquitectura de eclipse

Friday, November 10, 2006

Grammar DUDU+ mi lenguaje de programación

Este es el grammar del lenguaje DUDU+, este grammar (BNF production) esta hecho para la generación de un parser con la herramienta javacc. Como se ve la sintaxis es la de java pero con otras reglas, ya que se trata de javacc, que es el generador de parser más popular, se puede encontrar documentación de este en la página: https://javacc.dev.java.net/ . Les recomiendo que utilicen el mailling list en el cual hay personas dispuestas a ayudarte :-D.

/*
* DUDU+ codename MiniJava
* HECHO... in Dominican Republic
* author VГ­ctor Sosa <victornsosa@gmail.com> vns java
*/


options{
LOOKAHEAD = 1;
STATIC = false;
JAVA_UNICODE_ESCAPE = true;
}

PARSER_BEGIN(MiniJava)

import java.util.*;

public class MiniJava {

public static void main(String[] args) throws ParseException, TokenMgrError {

MiniJava parser;
String file = null;
long time = 0;
long parseTime = 0;
long startTime = 0;

if (args.length == 0)
{
System.out.println("Error messages...");
return;

} else if ( args.length == 1 ){
file = args[0];
System.out.println("Start parsing...");

try
{
parser = new MiniJava(new java.io.FileInputStream(file));

} catch ( java.io.FileNotFoundException e ) {

System.out.println("Parser error: Filename " + file + " not found." );
return;
}
} else {
System.out.println("Debe escribir: java MiniJava inputfile");
return;
}
try
{
startTime = System.currentTimeMillis();
parser.Start();
parseTime = System.currentTimeMillis();
time = parseTime - startTime;

System.out.println(" Time of parsing: " + time + " ms");
System.out.println(" DuDu successfully end");

} catch ( ParseException pex) {

System.out.println( pex.getMessage() );
System.out.println(" ParserException during parse file" );
}
}/* main method*/
}

PARSER_END(MiniJava)

/* Eat white space and comment*/
SKIP : {
" "
| "\t"
| "\n"
| "\r"
| <"//" (~["\n","\r"])* ("\n" | "\r" | "\r\n")>
| <"/*" (~["*"])* "*" ("*" | ~["*","/"] (~["*"])* "*")* "/">
}

TOKEN : /* RESERVED WORDS AND LITERALS */
{
< BOOLEAN: "boolean" >
| < BYTE: "byte" >
| < CHAR: "char" >
| < CLASS: "class" >
| < DOUBLE: "double" >
| < FALSE: "false" >
| < FLOAT: "float" >
| < FINAL: "final" >
| < INT: "int" >
| < LONG: "long" >
| < PUBLIC: "public" >
| < SHORT: "short" >
| < STATIC: "static" >
| < TRUE: "true" >
| < VOID: "void" >
| < NEW: "new" >
| < MAKE: "make" >
| < STACK: "stack" >
| < REPEAT: "repeat" >
| < UNTIL: "until" >
| < ADDSTACK: "addStack" >
| < ORDSTACK: "ordStack" >
| < ASCENDENTE: "ascendente" >
| < DESCENDENTE: "descendente" >

}

TOKEN : /* SEPARATORS */
{
< LPAREN: "(" >
| < RPAREN: ")" >
| < LBRACE: "{" >
| < RBRACE: "}" >
| < LBRACKET: "[" >
| < RBRACKET: "]" >
| < SEMICOLON: ";" >
| < COMMA: "," >
}

TOKEN : /* OPERATORS */
{
< ASSIGN: "=" >
| < INCR: "++" >
| < DECR: "--" >
| < PLUS: "+" >
| < MINUS: "-" >
| < STAR: "*" >
| < SLASH: "/" >

}

TOKEN : /* LITERALS */
{
< INTEGER_LITERAL:
< DECIMAL_LITERAL > (["l","L"])?
>
|
< #DECIMAL_LITERAL: ["0"-"9"] (["0"-"9"])* >
|
< FLOATING_POINT_LITERAL:
(["0"-"9"])+ "." (["0"-"9"])* ( < EXPONENT > )? (["f","F","d","D"])?
| "." (["0"-"9"])+ ( < EXPONENT >)? (["f","F","d","D"])?
| (["0"-"9"])+ < EXPONENT > (["f","F","d","D"])?
| (["0"-"9"])+ (< EXPONENT >)? ["f","F","d","D"]
>
|
< #EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+ >
|
< CHARACTER_LITERAL:
"'"
( (~["'","\\","\n","\r"])
| ("\\"
( ["n","t","b","r","f","\\","'","\""]
| ["0"-"7"] ( ["0"-"7"] )?
| ["0"-"3"] ["0"-"7"] ["0"-"7"]
)
)
)
"'"
>
|
< STRING_LITERAL:
"\""
( (~["\"","\\","\n","\r"])
| ("\\"
( ["n","t","b","r","f","\\","'","\""]
| ["0"-"7"] ( ["0"-"7"] )?
| ["0"-"3"] ["0"-"7"] ["0"-"7"]
)
)
)*
"\""
>
}

TOKEN : {
<IDENTIFIER: < LETTER > ( < LETTER > | < DIGIT > )*>
| <#LETTER: ["$","A"-"Z","_","a"-"z"]>
| <#DIGIT: ["0"-"9"]>
}


/*********************************************
* THE MINIJAVA LANGUAGE GRAMMAR STARTS HERE *
*********************************************/

/*
* Struts.
*/

void Start() throws ParseException :
{}
{
(TypeDeclaration() )*
}


void TypeDeclaration() :
{}
{
ClassDeclaration()
}

/*
* Declaracion de clases
*/
void ClassDeclaration() :
{}
{
( "final" | "public" | "static" )* "class" < IDENTIFIER >
"{" ( ClassBodyDeclaration() )* "}"

}

void ClassBodyDeclaration() :
{}
{
LOOKAHEAD(2)
FieldDeclaration()
|
Statement()
}

void FieldDeclaration() :
{}
{
( "public" | "static" | "final" )*
Type() VariableDeclarator() ( "," VariableDeclarator() )* ";"

}

void VariableDeclarator() :
{}
{
VariableDeclaratorId() [ "=" VariableInitializer() ]
}

void VariableDeclaratorId() :
{}
{
< IDENTIFIER > ( "[" "]" )*
}

void VariableInitializer() :
{}
{
ArrayInitializer()
|
Expression()

}

void ArrayInitializer() :
{}
{
"{" [ VariableInitializer() ( LOOKAHEAD(2) "," VariableInitializer() )* ] [ "," ] "}"
}

/*
* Tipos, nombre y sentencias
*/
void Type() :
{}
{
PrimitiveType() ( "[" "]" )*
}

void PrimitiveType() :
{}
{
"boolean"
|
"char"
|
"byte"
|
"short"
|
"int"
|
"long"
|
"float"
|
"double"
}

void Name() :
{ }
{
< IDENTIFIER >
}

/*
* Expression syntax
*/

void Expression() :
{}
{
ConditionalExpression() [ AssignmentOperator() AdditiveExpression() ]
}

void AssignmentOperator() :
{}
{
"="
}

void ConditionalExpression() :
{}
{
ConditionalOrExpression() [ "?" Expression() ":" ConditionalExpression() ]
}

void ConditionalOrExpression() :
{}
{
ConditionalAndExpression() ( "||" ConditionalAndExpression() )*

}

void ConditionalAndExpression() :
{}
{
EqualityExpression() ( "&&" EqualityExpression() )*

}

void EqualityExpression() :
{}
{
RelationalExpression() ( ( "==" | "!=" ) RelationalExpression() )*

}

void RelationalExpression() :
{}
{
AdditiveExpression() ( ( "<" | ">" | "<=" | ">=" ) AdditiveExpression() )*

}

void AdditiveExpression() :
{}
{
MultiplicativeExpression() ( LOOKAHEAD(2)( "+" | "-" ) MultiplicativeExpression() )*

}

void MultiplicativeExpression() :
{}
{
UnaryExpression() ( ( "*" | "/" ) UnaryExpression() )*

}

void UnaryExpression() :
{}
{
( "+" | "-" ) UnaryExpression()
|
UnaryExpressionNotPlusMinus()
}

void UnaryExpressionNotPlusMinus() :
{}
{
PostfixExpression()
}

void PostfixExpression() :
{}
{
PrimaryExpression() [ "++" | "--" ]
}

void PrimaryExpression() :
{}
{
PrimaryPrefix() ( PrimarySuffix() )*
}

void PrimaryPrefix() :
{}
{
Literal()
|
"(" Expression() ")"
|
AllocationExpression()
|
Name()
}

void PrimarySuffix() :
{}
{
"[" Expression() "]"
|
LOOKAHEAD(2)
"." "addStack" "(" ( Name() | Literal() ) ")"
|
"." "ordStack" "(" OrdenType() ")"

}

void OrdenType() :
{}
{
"ascendente"
|
"descendente"
}

void Literal() :
{}
{
< INTEGER_LITERAL >
|
< FLOATING_POINT_LITERAL >
|
< CHARACTER_LITERAL >
|
< STRING_LITERAL >
|
BooleanLiteral()
}

void BooleanLiteral() :
{}
{
"true"
|
"false"
}

void AllocationExpression() :
{}
{
"new" PrimitiveType() ArrayDimsAndInits()
|
MakeStack()
}

void MakeStack() :
{}
{
"make" "stack"
}

void ArrayDimsAndInits() :
{}
{
LOOKAHEAD(2)
( LOOKAHEAD(2) "[" Expression() "]" )+ ( LOOKAHEAD(2) "[" "]" )*
|
( "[" "]" )+ ArrayInitializer()
}

void Statement() :
{}
{
Expression() ";"
|
RepeatStatement()

}

void RepeatStatement() :
{}
{
"repeat" Statement() "until" "(" Expression() ")"

}

Sunday, November 05, 2006

Stevey en el pais de las maravillas (Google)

Interesante artculo de Stevey para decirnos que vivimos en un mundo de mentira :) que sincero, y de como se debe trabajar segun Google.

Los 10 lenguajes más demandados

En este artículo se confirma mas aun lo que dije anteriormente, para mis amigos que todavia estan pensando que M$ domina el negocio de las computadoras no significa que contole en que se programa.

Sunday, August 27, 2006

oferta de trabajo USA

Esto es para los amigos mios que no creen que en el mundo de Java no se gana dinero (Eso es porque solamente piensa en dinero) y creen que los chelitos solo se hacen con M$.

Vean este sueldito.

Wednesday, August 16, 2006

The Power of Three - Eclipse, Tomcat, and Struts

Un pequeño tutorial de la integración de estos tres legendarios en el desarrollo de aplicaciones web de una manera ágil.

Branching with Eclipse and CVS

Un articulo para estar claro de como se manejan los branch en Eclipse con CVS.

http://www.eclipse.org/articles/Article-CVS-branching/eclipse_branch.html

Tuesday, August 15, 2006

Nifty Corners - Esquinas redondeadas

Como obterner cuadros con esquinas redondeadas, pero lo más importante compatible con los diferentes navegadores, solución usar Nifty Corners , es una librería ligerade css y javascript para lograr este efecto es bien fácil de usar en nuestros proyectos.

Ruby on Rails and J2EE

Este artículo es una comparacion de los modelos de desarrollo propuesto por Ruby on Rails y J2EE.

Mostrando cada ventaja y desventaja, un buen artículo con los pies sobre la tierra.

open source Java para octubre

En este artículo se expresa lo que mucho tal vez mucho han escuchado, pero esta vez no es solo un deseo o rumor, la plataforma Java se piensa librerar con una licencia compatible con el open source, lo cual si se haria seria un hito en la industria.

Esto incluye un compilador, un virtual machine, etc. al principio y todo este proceso tardará hasta el 2007 cuando toda la plataforma será librerada completamente.

Friday, August 11, 2006

EJB3 - Conceptos Basicos

En este artículo se trata de explicar cuáles son los distintos tipos de Enterprise Java Bean y cuáles son los propósitos de cada uno de ellos : Stateless Session Bean, Stateful Session Bean, Entity Bean y Message Driven Bean.

Cualquiera que quisiera entender el mundo del EJB este es un buen comienzo.

Spring AOP

Spring AOP


Un poco de orden en tus proyectos ;)

Spring AOP es útil para realizar tareas puntuales que no encajan de forma natural en nuestras entidades ni en nuestra lógica de negocio.

Este artículo muestra de manera básica como usarlo en nuestros proyectos.