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

viernes, 6 de noviembre de 2009

Dialect class not found

BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [applicationContext.xml]: Invocation of init method failed; nested exception is org.hibernate.HibernateException: Dialect class not found: org.hibernate.dialect.HSQLDialect

Algo que en principio no deberia pasar, googleando veo que a varios les paso, pero no vi la solucion.

Empece a cambiar de todas las formas posibles mis pom´s files (maven) y nada,

Bueno, el error viene dado por la configuracion del session factory en spring




<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="hibernateProperties">
<value>
hibernate.hbm2ddl.auto=create
hibernate.dialect=org.hibernate.dialect.HSQLDialect" " <--- ahi habia un espacio en blanco
hibernate.show_sql=true
</value>
</property>


el parser se ve que se mambea y no corta asi que quitando los espacios en blanco, todo funciona bien

jueves, 31 de julio de 2008

Threads-Hilos En Java y C#

Multi hilos o Multi threads

Tanto java como .Net proveen soporte para multihilos.

Ambos corren con un hilo principal (ejecutado por el main) y desde aqui en adelante se pueden crear hilos hijos, workers, y aqui el el programa se vuelve multithread.

Los procesos separados (workers) corren en distintos pedazos de memoria (del stack)
y son dos instancias distintas.

Se puede compartir datos entre ellos por ejemplo con variables estaticas, pero hay que tener mucho cuidado porque la modificacion de uno puede afectar al desempeño del otro.
Esto se llama concurrencia, y para que esto no afecte, se puede loquear la modificacion/lectura de la variable.

Vamos con un ejemplo.

clase CajeroAutomatico{

Cuenta unaCuentaBancaria;
funcion ExtraerDinero(Double cantidad){

if (unaCuentaBancaria.dineroDisponible > cantidad ){


unaCuentaBancaria.dineroDisponible = unaCuentaBancaria.dineroDisponible -cantidad;


}
}
}





El procesamiento de los hilos (manejando los tiempos de procesador que le otorga el sistema operativo a cada hilo) puede dedicarle el tiempo que crea necesario a cada hilo, y frenarlo cuando tambien lo quiera. Esto no lo podemos controlar nosotros porque depende de todo lo que esta corriendo en la pc en ese momento.


Suponiendo que vieje Pepe Argento al cajero, y decide sacar $900 de su cuenta que tiene $ 1000.
entra al método ExtraerDinero , entra al if, y el sistema operativo descide frenar por un momento la ejecución de este programa antes de sacar dinero, para darle un rato de procesador a otro programa.

Sabrina Rojas (mujer de el :) ) descide ir y sacar $500 de dinero de la misma cuenta, y el SO le otorga un rato de procesador a ella (a su programa)

Pero a diferencia del otro, no lo frena dentro del if, sino que sigue y extrae

ahora el SO , vuelve a darle tiempo al proceso frenado anteriormente (frenado justo antes de sacar) y quiere extraer.

Que paso aca?
la cuenta tenia $ 1000.
Sabrina saco $500 (qdan $500)
pepe quiere sacar $900 , Esto reventaria en algun lado , ya que faltan $400.


El problema fue la concurrencia sobre la variable "dineroDisponible" .

para ello toda la ejecucion del método, o mas concreto, del if , debería estar loqueada.

algo asi como


lock {
if (...){...}

}



Con esto, El SO sabe que NO debe frenar el proceso dentro del lock ( o sea en el if)

de esta manera, Sabrina no podria entrar a la condición del if, ya que cuando salga del if de pepe quedaran $100.



ejemplo c#

class ThreadTest {

static void Main() {

Thread t = new Thread (WriteY);

t.Start(); // Run WriteY on the new thread

while (true) Console.Write ("x"); // Write 'x' forever

}



static void WriteY() {

while (true) Console.Write ("y"); // Write 'y' forever

}

}


sacado de http://www.albahari.com/threading/index.html#_Introduction

ahi veriamos como le asigna ("aleatoriamente") tiempo a cada uno de los procesos.

la salida seria algo asi


yyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxyyyyyyyyy
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyxxxxxxxxyyyyy
xxxxxxxxxxxxxx



(un rato a cada uno)

Java:

 

En Java para la creacion de hilos, se hereda de la clase Thread Java aplica aqui el patrón Template.

La clase Thread es abstracta e implementa la interfaz Runeable, que tiene el metodo run();

Nos provee métodos para:

start() : Este metodo ejecutara el metodo run() implementado por nosotros (aqui esta el patrón template)

isAlive() : True si el hilo esta corriendo

sleep(N) : Duerme al hilo N milisegundos

interrupt() : Pide al hilo que se interrumpa (InterrumpedException si estaba en sleep)

isInterrupted() : True si esta interrumpido

priority : Prioridad del hilo (No conviene abusar de esto a menos que se sepa bien lo que se hace)

yield() : El hilo deja su ejecucion para darle lugar al siguiente. la proxima vez que le toque se ejecutara

join() : El hilo actual se queda esperando hasta que el hilo que llamo al join termine su ejecucion y nuestra clase hija,

 

 

 

 

Sacado de Algoritmos 3 (Fontela FIUBA)

 

 

Dibujo1

 

Para crear un hilo:

class HiloConcreto extends Thread {
    public void run() {
        ... código del hilo ...
    }
        ...
    }
        ...
    HiloConcreto unHilo = new HiloConcreto();
    unHilo.start(); // start llama a run de manera polimorfa

 

 

DotNet C#

 

A diferencia de Java, c# aplica el patrón  Command, donde se le pasa “Un puntero a función” del método a ejecutar.

Usamos el namespace

using System.Threading;

y en main por ejemplo

 

Thread unHiloWorker = new Thread(new ThreadStart(metodoAEjecutar));

unHiloWorker.Start();

 

 

Donde Start() ejecutara el metodo que le hayamos pasado (aqui el patron command)

Templates de proyectos / Items en Visual Studio 2005

Bueno, primero voy a crear un template para Proyectos , y de paso, voy a hacer uno para crear proyectos de test con Nunit y Rhino Mocks.



Template de project

Primero creamos un proyecto Comun , con el nombre que quieras ,
(Mi caso KellNess.Core.Test, test de KellNess.Core una libreria mia )

Este lo hice console application (solo por facilidad de pruebas de test, pero puede ser un library )

Agrego referencia a las dll de NUnit y Rhino

NUnit
http://nunit.org/index.php?p=download

Rhino
http://nunit.org/index.php?p=download


Agrego un Carpeta "Tests"

Y dentro de ella una clase

"UnitTest.cs"

donde pongo :





using System;
using System.Text;
using System.Collections.Generic;
using NUnit.Framework;

namespace AdminCris.test
{
/// <summary>
/// //Solo para probar que NUnit anda
/// </summary>

[TestFixture]
public class UnitTest
{
public UnitTest()
{

}

[TestFixtureSetUp]
public void SetUp()
{

}



[Test]
public void TestMethod()
{
//Solo para probar que NUnit anda
NUnit.Framework.Assert.AreEqual(1, 1);
}
}
}


Ahora selecciono en el Solution Explorer El proyecto , y vamos a

File->Export Template

Si no esta seleccionado el proyecto (porque tenemos otro) lo seleccionamos y siguiente

Nombre, icono y descripcion y lesto.Finish


...
Ahora si vamos a New Proyect, deberia aparecer el nuevo, que si lo seleccionamos, pondra la copia de lo que teniamos en el template dentro.



La "magia" es
en
C:\Documents and Settings\[usuario]\My Documents\Visual Studio 2005\My Exported Templates\

pone un zip con lo que teniamos, y luego lo deszipea (nuevo verbo)



Template de Item

lo mismo, pero creo una clase


/**
* Clase Creada por MBerrueta
* 30/07/2008 - 09.24
* **************************************************
*
                              /----\
-------/ \
/ \
/ |
-----------------/ --------\
----------------------------------------------

$ aptitude -vvvvvv moo
¿Qué es? Un elefante siendo devorado por una serpiente, evidentemente.

*/

namespace KellNess.Web.Test
{
/// <summary>
/// Clase para
/// </summary>
public class Class1
{
/// <summary>
/// Constructor
/// </summary>
public Class1()
{

}

}
}



le agrego lo que quiero en mi caso la Documentacion y el public (algo que me rompe las bolas el que no te ponga el public class )

la seleccionamos, vamos a file->ExportTemplate , y lo mismo pero con Item Template.


Salutes

jueves, 3 de julio de 2008

Web Control en Asp.Net

Bueno la idea es hacer un WebControl que se le añada un listado de opciones, y este las valla sugiriendo al escribir en el TextBox, algo asi como http://www.google.com/webhp?complete=1&hl=en
Pero muuuucho mas pedorro, sin web service ( para eso ver el ajax control toolkit http://www.asp.net/AJAX/AjaxControlToolkit/Samples/AutoComplete/AutoComplete.aspx)

Bueno en un proyecto distinto (seria lo ideal para reutilizar este)

Agregamos Carpeta al proyecto "WebControls"
y dentro otra "SuggestTextBox"


Agregamos una Clase que herede de textbox llamada "SuggestTextBox"




using System;
using System.ComponentModel;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Drawing;
using System.Web.UI.HtmlControls;
using System.Web;
using System.Collections.Generic;

namespace XFramework.Web.WebControls
{

/// <summary&gt;
/// Textbox con sugerencia al estilo http://www.google.com/webhp?complete=1&hl=en
/// </summary&gt;
public class SuggestTextBox: TextBox
{

}
}




le agregamos la propiedad



private List<string&gt; values;

/// <summary&gt;
/// Valores a Sugerir en la escritura de texto
/// </summary&gt;
public List< string> SuggestValues
{
get {
if (values == null)
{
values = new List<string&gt;();
}
return values; }
set { values = value; }
}

private ListBox lbox;

public ListBox LBox
{
get
{
if (lbox == null)
{
lbox = new ListBox();
}

lbox.Rows = SuggestSize;
lbox.DataSource = SuggestValues;
lbox.DataBind();
lbox.Width = this.Width;
lbox.Attributes.Add("onclick", "javascript:setSelectedText('M" + this.ClientID + "');");

return lbox;
}
set { lbox = value; }
}






sobre escribimos el metodo render




/// <summary&gt;
/// Renderiza el textbox y un div con posibles datos
/// </summary&gt;
protected override void Render(HtmlTextWriter writer) {

writer.AddAttribute("m", "M" + this.ClientID);
writer.RenderBeginTag("div");
writer.AddAttribute("onKeyUp", "javascript:showSuggest('M" + this.ClientID + "');");
base.Render(writer);

writer.RenderBeginTag("div");

LBox.Style.Add("display", "none");
LBox.RenderControl(writer);

//dummy
LBox.CssClass = "dummy";
LBox.RenderControl(writer);

writer.RenderEndTag();
writer.RenderEndTag();
}



-----------------------------------------------------------------------

dentro de la carpeta "SuggestTextBox"
agregamos la carpeta resources

y dentro agregamos un nuevo item javascript y otro css

suggestTextBox.css
suggestTextBox.js

------------------------------------------------------------------------

Nota: No importa si es la mejor manera de hacer esto (seguro no la mas prolija) pq tengo q terminarlo rápido, lo importante son los pasos para la creación de WebControl



suggestTextBox.css



div[m] select {
color:CornflowerBlue;
cursor:pointer;
padding :1px;
}

div[m] select option {
padding :5px;
}

div[m] select option:hover {
background-color:navy;
color:white;
font-weight:bold;
}

.dummy{
visibility:hidden;
display:none;
position:absolute;
}



------------------------------------------------------------------------

suggestTextBox.js



/*
Math. 03/07/2008
Requiere JQuery
*/

/*Setea el texto seleccionado en el select al textbox*/
function setSelectedText(mId){
var mTag = "div[m=" + mId +"]" ;

var txt = $$$(mTag +' input')[0];
var lb = $$$(mTag +' select')[0];
try{
txt.value = lb.value;
//lb.show("slow");
$$$(mTag +' select').hide("slow");
}
catch(e){}
}

var opciones;
/*Muestra y filtra el suggest*/
function showSuggest(mId){
var mTag = "div[m=" + mId +"]" ;

var txt = $$$(mTag +' input')[0];
var lb = $$$(mTag +' select')[0];
var dummys = $$$(mTag +' .dummy option') ;

var value = txt.value +'(.*?)' ;
var regex = new RegExp(value );

lb.options.length = 0;

//alert(value);
for ( indice = 0; indice < dummys.length; indice++)
{
if ( dummys[indice].value.match( regex )){
//$$$(opciones[indice]).hide();
lb.options.add( new Option(dummys[indice].value,dummys[indice].value ) , lb.options.length );
}
}

lb.value = txt.value;
$$$(mTag +' select').show("slow");
}


--------------------------------------------------------------

Ahora en el assembly.info (AssemblyInfo.cs)

agregamos



/* ******************** ******************** ******************** */
/* SuggestTextBox */
/* ******************** ******************** ******************** */
[assembly: WebResource("XFramework.Web.WebControls.SuggestTextBox.resources.suggestTextBox.js", "text/javascript")]
[assembly: WebResource("XFramework.Web.WebControls.SuggestTextBox.resources.suggestTextBox.css", "text/css")]



donde XFramework.Web.WebControls.SuggestTextBox.resources es las Carpetas relativas donde se encuentra el archivo. (OJO ES CASE SENSITIVE)

y asegurarse que ambos archivos tienen seteada la propiedad Build Action en : "Embedded Resource" Para esto se selecciona y se presiona F4.


--------------------------------------------------------------


Ahora el paso final es que cuando valla a renderizar agregue estos archivos al header


para esto sobreescribimos el onPreRender



/// <summary&gt;
/// agrega los js, css necesarios
/// </summary&gt;
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
HtmlLink linkExists = Page.Header.FindControl("xTxtLink") as HtmlLink;
if (linkExists == null)
{
HtmlLink hlLight = new HtmlLink();
hlLight.Href = getCssPath();
hlLight.ID = "xTxtLink";
hlLight.Attributes["text"] = "text/css";
hlLight.Attributes["rel"] = "stylesheet";
Page.Header.Controls.Add(hlLight);
}

if (!DesignMode)
{
if (!Page.ClientScript.IsClientScriptIncludeRegistered("suggestTextBox"))
ScriptManager.RegisterClientScriptInclude(this, this.GetType(), "suggestTextBox", GetJScript());
}
}


private const string RESOURCEPATH = "XFramework.Web.WebControls.SuggestTextBox.resources.";

private string getCssPath()
{
return Page.ClientScript.GetWebResourceUrl(GetType(), RESOURCEPATH + "suggestTextBox.css");
}

private string GetJScript()
{
return Page.ClientScript.GetWebResourceUrl(GetType(), RESOURCEPATH + "suggestTextBox.js");
}


--------------------------------------------------------------------------


Probamos un sitio web y un form . agregamos las dependencias y



<%@ Register Assembly="XFramework.Web" Namespace="XFramework.Web.WebControls" TagPrefix="XWebControl" %>


and



<xwebcontrol:suggesttextbox id="miSuggestTxt" runat="server">
</xwebcontrol:suggesttextbox&gt;


y en el page load



List<string&gt; list = new List<string&gt;();
list.Add("pepe");
list.Add("asc");
list.Add("pesdfpe2");

list.Add("fdss");
miSuggestTxt.SuggestValues = list;
miSuggestTxt.Width = new Unit(200);

martes, 1 de julio de 2008

Nuestro propio Archetype Maven (Arquetipo=Template)

Bueno, básicamente un archetype es un Template (molde) de Maven, una herramienta que explicare con mas detalle en otro post.

Para Crear un template propio, un molde que genere todo lo que queramos apara hacer el típico
"New Project" , y que sea como queramos , hacemos lo siguiente (Todo esto teniendo Maven2 ya instalado)

creamos una carpeta raíz donde nos guste .

$ cd carpeta



"D" es para indicar parámetro
"groupId" DgroupId=nombre de la empresa, grupo , etc.
"artifactId" DartifactId=nombre del archetype (nombre del template).
"archetypeArtifactId" DarchetypeArtifactId= nombre del template en el que nos basamos




$ mvn archetype:create -DgroupId=mberrueta -DartifactId=proyecto-basico -DarchetypeArtifactId=maven-archetype-archetype


esto nos va a crear una estructura de directorios que también estará en la explicación de maven. =)

en src estan los fuentes del template (archetype en adelante)
desp de compilar estara la carpeta target
main/resources tenemos:
archetype-resources (aca van los templates)
META-INF (aca va el listado de archivos a utilizar)

nos va a crear como debe ser el pom (xml de configuración de maven) , un "hola mundo" y un test de "hola mundo"

hay un bug que para arreglarlo se debe reemplazar en los "holas mundos " (App.java y AppTest.java el :

package $"el groupId que pusimos"; --->por---&gt; package $package;

luego en el pom.xml


$"el groupId que pusimos"
$"el artifactId que pusimos"
$1.0-SNAPSHOT

por

$groupId
$artifactId
$version


Luego, Editamos/Agregamos los .java que queramos , o el POM y cuando creemos una aplicación con nuestro archetype utilizara este template.
Para Agregar hay que editar el archivo
META-INF\maven\archetype.xml

y agregarle el source que queramos por ej:


src/main/java/App2.java

luego


$ mvn install


Con esto lo tenemos instalado en nuestro repositorio local, y ya podemos usarlo.

Ahora, para usarlo sin las comillas (")

mvn archetype:create
-DarchetypeGroupId="el groupId que pusimos al template"
-DarchetypeArtifactId="el artifactId que pusimos al template"
-DarchetypeVersion=1.0-SNAPSHOT
-DgroupId="group id de este proyecto"
-DartifactId="artifact id de este proyecto"

ej:


$mvn archetype:create
-DarchetypeGroupId=mberrueta
-DarchetypeArtifactId=proyecto-basico
-DarchetypeVersion=1.0-SNAPSHOT
-DgroupId=mberrueta
-DartifactId=progama-nuevo