Mostrando entradas con la etiqueta Programming. Mostrar todas las entradas
Mostrando entradas con la etiqueta Programming. Mostrar todas las entradas

viernes, 17 de mayo de 2013

Java buenas prácticas Instanciar objetos al mínimo.



Una de las operaciones que más coste tienen a la hora de consumir memoria en los desarrollos Java, son las instanciaciones de objetos, estas deben realizarse solo en los casos que sea necesario, evitando de esta manera consumir memoria que no es necesaria. Para ello, existen técnicas que evitan la instanciación de objetos que no sean necesarios.


Vamos a ver ejemplos para los casos de objetos de tipo String, Boolean o Integer. Aunque los casos que más memoria consumen son los objetos personalizados, que estarán formados por más de un atributo de estos tipos, o listas y mapas de variables, pero de esta forma, podemos evitar algunos de esos casos  si lo extrapolamos a nuestros objetos.

Deben evitarse instanciaciones de objetos de tipo String como la siguiente: String a = new String(“Hola”), para lo que podemos usar String a = “Hola” evitando la llamada a new, que consume espacio en memoria, o también String.valueOf(“Hola”).

Para las Boolean, además de la factoría estática (Boolean.valueOf(true)), tenemos la posibilidad, de indicar el valor de la siguiente manera Boolean b = Boolean.TRUE, que tampoco realizaría una instanciación de Boolean.

Citando a los propios creadores de la clase Boolean:

“It is rarely appropriate to use this constructor. Unless a new instance is required, the static factory valueOf(boolean) is generally a better choice. It is likely to yield significantly better space and time performance.”

Solo hay un caso en el que crear una instancia nueva de un Boolean, tiene sentido, y es cuando se quiera hacer una comparación por referencia y no por el valor.

Para los objetos de tipo Integer, tenemos disponible al misma factoría estática, que podemos usar, Integer.valueOf(1), que nos evita la llamada al new de Integer.

lunes, 30 de julio de 2012

JODConverter sin mantenimiento

Aunque ya ha ocurrido hace bastante tiempo, el creador de la popular herramienta (API Java, Python) de automatización de conversiones de documentos en multiples formatos, basada en Open Office, "Mirkonasato", ha decidido dejar de mantener el proyecto, de tal manera que lo ha dejado "huerfano" en gitHub, en esta pagina

Para consultas sobre el proyecto, sigue manteniendo la pagina de google code.

Espero que el proyecto pueda ser continuado (algún tipo de fork) ya que es realmente interesante.

Y desde aqui mi mas sincera enhorabuena al creador.

[caption id="attachment_906" align="aligncenter" width="300"]JodConverter JodConverter[/caption]

lunes, 27 de febrero de 2012

Técnicas de ataque - SQL Injection (Inyección SQL)

Aunque se trata de un tema, bastante antiguo, y que no será facil de reproducir, aunque seguro que quedan sitios, que son vulnerables a este tipo de cosas. SQL Injection es una técnica de ataque a paginas, que intentan colar codigo SQL, dentro de codigo SQL de la aplcación destino, para romper o acceder a información. Con esto se quiere decir, que por ejemplo, si suponemos que una pagina web, tiene en su pagina de login, dos campos, usuario y contraseña, muy habitual, y para buscarlo hace lo siguiente:

SELECT * FROM Users WHERE Username='usuario' AND Password='contraseña'

Si hicieramos que tanto el usuario, como la contraseña valieran 1' OR '1'='1'

La sentencia quedaría de la siguiente manera:

SELECT * FROM Users WHERE Username='1' OR '1' = '1'  AND Password='1' OR '1' = '1'

Lo que técnicamente devolvería una lista con todos los usuarios, y podría en algunos casos, concedernos acceso a la página en cuestión. Curioso cuanto menos.

Si queremos ser un poco más destructivos, y conocemos el nombre de una tabla, o podemos intuir el nombre, se puede hacer algo como esto, a través de SQL Injection.

Si por ejemplo, se le da el valor al password de: x'; DROP TABLE users; -- y al usuario, por ejemplo 1 (este valor es indiferente para este caso)

el resutaldo sería, cogiendo la SQL arriba citada, el siguiente:

SELECT * FROM Users WHERE Username='1' OR '1' = '1' AND Password='x'; DROP TABLE users; --'

El -- final, es importante, porque se trata de dejar en comentario, el final de la SQL, paa que no falle, la comilla, que nos habran puesto, para parametrizar la String SQL de la contraseñá, en este caso el resultado, es que si la SQL se está ejecutando con permisos de borrado, y la tabla USERS existe, no exisitirá más.

Una vez explicado, como es SQL Injection, haciendo el mal, un par de ideas, para evitarlo, sin que sean muy complicadas de implementar.

Si por ejemplo, en vez de almancenar las contraseñas de los usuarios, lo que se almancena es un HASH de las contraseñas, como pueden ser SHA1 o MD5, entonces, al comparar las contraseñas, lo que se enviará a SQL para comprar no será el texto escrito por el usuario, sino el HASH que se genera, lo que en ningún caso será una SQL Injection.

Por otro lado, otra opción de baja tecnología, para solucionar este problema, quizá mucho menos fiable, pero si mucho más sencilla, es prohibir ciertos caracteres reservados de SQL en los textos, como pueden ser, las comillas simples, el OR, el AND, lo que viene a ser una lista negra de textos prohibidos, para que no ataquen al sistema.

Curiosidad final, si pusieramos este valor a la contraseña,

1; update users set password = 'password'; select *

Esto haría que las contraseñas de todos los usuarios, pasasen a valer "password" lo que tiene gracia, al menos si no le pasa a tu aplicación.

lunes, 23 de enero de 2012

Google Analytics (error _gat undefined)

[caption id="" align="alignright" width="188" caption="Image via CrunchBase"]Image representing Google Analytics as depicte...[/caption]

Un error al parecer bastante habitual el empezar con Google Analytics, es el de encontrarnos con el siguiente error “_gat undefined“ parece que esto se debe a no alcanzar el código Javascript que Google tiene colgado al respecto, es imporante tener en cuenta que esta línea debe encontrarse dentro de la página donde se quiera hacer funcionar Google Analytics.
<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
</script>
Para evitar el error, cuando estamos hacienda pruebas en local, puede utilizarse el siguiente cambio al código Javascript, que como vemos, comprueba que se ha declarado la variable _gat para poder obtener el tracker de Analytics..
<script type="text/javascript">

function mygat(){
if (typeof(_gat) == 'undefined') {
window.setTimeout(mygat,1000);
}
else {
var pageTracker = _gat._getTracker("UA-xxxxxxx-x");
pageTracker._trackPageview();
}
}

function addLoadEvent(func) {
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = func;
}
else {
window.onload = function() {
if(oldonload){oldonload();}
func();
}
}
}

addLoadEvent(mygat);
</script>

jueves, 28 de octubre de 2010

Nacimiento de CMMI

Siguiendo con la evolución del modelo, en el año 2002, el SEI, relanza CMM, y lo renombra, como CMMI, este modelo, integra todas las áreas funcionales, no exclusivamente, la de desarrollo y mantenimiento, sino que llega hasta los recursos humanos, adquisición o producción.

También reinventa el modo de valorar los procesos, lo hace de una forma individualizada, aunque sigue manteniendo el sistema de niveles de CMM, dentro del nuevo CMMI, se pueden distinguir tres áreas a las que denomina de la siguiente manera:

  • CMMI para el Desarrollo (CMMI-DEV o CMMI for Development), Versión 1.2 fue dado a conocer en agosto de 2006. En él se tratan procesos de desarrollo tanto productivos como de servicios, se pueden diferenciar los dos:

    • CMMI-DEV, para el desarrollo en servicios

    • CMMI-DEV + IPPD (Integrated Product and Process Development) para la integración de producción y desarrollo de procesos.



  • CMMI para la adquisición (CMMI-ACQ o CMMI for Acquisition), la versión 1.2 llega a las empresas en noviembre de 2007. En él se tratan la gestión de la cadena de suministro (suppy chain management), adquisición y contratación externa en los procesos del gobierno y la industria.

  • CMMI para servicios (CMMI-SVC o CMMI for Services), está diseñado para cubrir todas las actividades que requieren del uso de servicios, en su forma más amplia.

sábado, 28 de agosto de 2010

AJAX técnica de carga de páginas Web

AJAX, carga parcial de páginas Web.

AJAX no es un lenguaje de programación en si mismo, sino una serie de técnicas que agilizan la visualización de las paginas Web, es una gran idea, cuando tenemos paginas pesadas que necesitan actualizar datos, y si no queremos enviar las paginas completas para ser recargadas, podemos actualizar de la pagina solicitada solo los campos o datos necesarios, que van a modificarse, de esta manera podemos ahorrar muchos recursos a la hora de visualizar las paginas, los ejemplos que veremos a continuación son código JavaScript que puede utilizarse para realizar tareas de AJAX en paginas Web, notar que los ejemplos están basados en JSP con JavaScript, aunque podríamos extrapolar estas situaciones a paginas ASP o PHP, con diferentes lenguajes de programación de scripts.

[caption id="attachment_391" align="aligncenter" width="300" caption="AJAX"][/caption]

Aviso los ejemplos son muy básicos, se pueden hacer cosas mucho más potente que lo que se refleja aquí. Esto solo es una guía básica.

Cambios en un componente por ID

<!— REEMPLAZAR TEXTO -->

<script type="text/javascript">

function cambio() {

document.getElementById('nombre').innerHTML = "Hola, mundo <b>AJAX</b>!";

}

</script>

<p><a href="javascript:cambio()">Cambiar</a></p>

<div id='nombre'>

Hola, Mundo!

</div>

<!-- FIN REEMPLAZAR TEXTO -->

<!-- TEXTO CON FICHERO -->

<script type="text/javascript">

var http = false;

if(navigator.appName == "Microsoft Internet Explorer") {

http = new ActiveXObject("Microsoft.XMLHTTP");

} else {

http = new XMLHttpRequest();

}

http.open("GET", "test.txt");

http.onreadystatechange=function() {

if(http.readyState == 4) {

alert(http.responseText);

}

}

http.send(null);

</script>

<!— FIN TEXTO CON FICHERO -->

<!— AMBOS -->

<script type="text/javascript">

var http = false;

if(navigator.appName == "Microsoft Internet Explorer") {

http = new ActiveXObject("Microsoft.XMLHTTP");

} else {

http = new XMLHttpRequest();

}

function replace() {

http.open("GET", "test.txt", true);

http.onreadystatechange=function() {

if(http.readyState == 4) {

document.getElementById('nombre').innerHTML = http.responseText;

}

}

http.send(null);

}

</script>

<p><a href="javascript:cambio()">Cambiar</a></p>

<div id="nombre">

Hola, Mundo!

</div>

<!— FIN AMBOS -->

jueves, 11 de febrero de 2010

Acceso a Base de datos Access desde java

Una entrada muy rápida de como se conecta la base una base de datos Access a un programa Java.

Para este caso, notificar que Access normalmente el acceso es con USER y PASS en blanco, algo asi: conexion = DriverManager.getConnection("jdbc:odbc:" + NOMBDD, "","");

Comentar además que para que una base de datos, este visible para el driver, debe estar incluida en el origen de datos de Windows, que se encuentra en inicio --> Ejecutar --> ODBCAD32. En la ventana que salta, le damos a añadir (add) elegimos Driver Do Microsoft Access (*.mdb) y introducimos los datos de la base de datos y le damos un nombre, el que usaremos en el código Java


public void abrirConexion() {
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
conexion = DriverManager.getConnection("jdbc:odbc:" + NOMBDD, "USER","PASS");
System.out.println("Conexión");
statment = conexion.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
System.out.println("Conexion exitosa");
} catch (Exception e) {
System.out.println("No se ha podido cargar el Driver JDBC-ODBC");
e.printStackTrace();
}
}
 
public void cerrarConexion() {
try {
statment.close();
conexion.close();
} catch (SQLException e) {
e.printStackTrace();
System.exit(1);
}
}
 
Mañana desde mysql!