viernes, 18 de diciembre de 2009

Un Chistesito

Ayer un compañero, me mando el siquiente chiste, jojojo, aqui lo comparto. no es tan bueno como el de "mister polletas" pero igual salva :D.


Ricardo, un tipo que siempre fue muy servicial y educado (debe haber sido portaliano) va caminando por la calle cuando de repente cae al suelo debido a un ataque al corazón y muere.
Como toda buena persona, Ricardo va al cielo.
Al llegar le abre la puerta San Pedro y le dice:
Bienvenido seas hijo.
Ricardo le dice a San Pedro Oye Santo, yo no debería estar aquí todavía..
Pregunta San Pedro:
¿Por qué hijo mío?
No estaba preparado. Dejé a mi familia en mal estado y quisiera arreglar eso antes de venir y por lo tanto te pido que me dejes regresar a mi casa.
Puedes regresar, pero únicamente convertido en un animal doméstico.
Ricardo, se queda pensativo unos segundos y dice:
Está bien, regresaré en forma de gallina, ya que en mi casa tengo muchas.
Llega a su casa convertido en una hermosa gallina de plumas blancas.

Al caer en el gallinero las otras gallinas quedan asombradas y se le
acercan formando una rueda, diciendo cosas muy bonitas de la gallina
recién llegada, pero como en todos los lugares, llega una gallina
envidiosa que dice:
Tienen razón, esta gallina es muy bonita, pero es muy probable que no
pueda poner huevos.
Ricardo queda asombrado por el comentario, y en ese momento todas las
gallinas empiezan a gritar:
¡Que ponga un huevo! ¡Que ponga un huevo!
Ricardo asustado empieza a empujar hasta que de repente, y para su
asombro, pone un huevo.
Todas las gallinas capitaneadas por la envidiosa, gritan felices:
¡Que ponga otro!, ¡Que ponga otro!,
Ricardo, ya en trance, y emocionado sigue empujando hasta poner otro huevo.
Las gallinas, en el colmo del paroxismo, gritan nuevamente:
¡Que ponga otro! ¡Que ponga otro!
cuando, de repente, Sofi, la esposa de Ricardo aparece y sacudiendole le dice:
¡Ricardooooo despiértate! ¡Te estás cagando en la cama!!

--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

miércoles, 16 de diciembre de 2009

Como congelar Cerveza Rápidamente

Hace tiempo, me llego un correo, y realmente lo encontre util, aqui lo dejo tal cual, :D. a mas de alguien le va a ser util, jejeje.

La carne ya está en la parrilla



Entonces, llegan los amigos con latas y más latas de
cerveza, estúpidamente calientes. ¿Cómo las enfriamos?

El profesor Cláudio Furukawa, del Instituto de Física de la
Universidad de Sao Paulo lo explica.


Ponga el hielo en la hielera....


Agregue 2 litros de agua por cada bolsa de hielo


...agregue medio kilo de sal


y medio litro de alcohol

El agua aumenta la superfície de contacto,
la sal reduce la temperatura de fusión del hielo (tarda más en derretirse)
y por una reacción química, el alcohol retira el calor de la mezcla.

Algunos llaman a este líquido "mezcla frigorífica":
HIELO, ALCOHOL, SAL y AGUA


La mezcla frigorífica es barata y la cerveza queda helada
en solo 3 minutos.
Y esperar 3 minutos no es ningún sacrifício, ¿verdad?
Pase esta información de utilidad pública.



--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

lunes, 14 de diciembre de 2009

Diagramas Uml de forma facil y bonita

Hace un tiempo queria hacer diagramas de forma facil y bonita, estaba haciendo un desarrollo en el que, el resultado era un diagrama de clases, que salia de la lectura de varios Xml's. especificamente de los mapeos de hibernate.

buscando, y buscando encontre http://yuml.me/ . una pagina web en la cual puedes hacer diagramas muy bonitos solo escribiendo muy poco. por ejemplo

Diagramas de clases:

Este diagrama se genera solo con este texto.

[Customer]+1->*[Order]
[Order]++1-items >*[LineItem]
[Order]-0..1>[PaymentMethod]
bonito y facil no. aqui esta el generador de diagramas de clases y la documentacion http://yuml.me/diagram/scruffy/activity/draw

Diagramas de secuencias o actividad:

Este tambien se genera con muy pocas linas. aqui esta como se genera este ejemplo

(start)->logged in->(Show Dashboard)->|a|->(end)
not logged in->(Show Login)->|a|


Casos de uso:

igual que los anteriores, muy facil e intuitivo, aqui el codigo que genera esto.

[User]-(Login)
[User]-(Logout)
(Login)<(Reminder) (Login)>(Captcha)
El generador y documentacion esta aqui. http://yuml.me/diagram/scruffy/usecase/draw


El generador esta desarrollado en java, este es gratis, pero tambien esta la opcion de comprarlo y dejarlo corriendo como servicio [seria genial].

Estos diagramas pueden generarse como imagen, o como pdf, si es como imagen podemos mostrarla en cualquier web poniendo com src la ruta de la imagen, por ejemplo:
http://yuml.me/diagram/scruffy/usecase/%5BUser%5D-(Login),%20%5BUser%5D-(Logout),%20(Login)%3C(Reminder),%20(Login)%3E(Captcha)

Lo bueno de esto, es que no tenemos que instalar absolutamente nada :).

Ojala sea util esto de los diagramas.


--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

lunes, 23 de noviembre de 2009

One Tree Hill

Hace un tiempo que veia esta Serie, es bastante buena se llama "one Tree Hill"

Aqui dejo el intro de la primera temporada, con la cancion de Gavin DeGraw y la cancion se llama "I Don't Want to Be"


Tambien dejo una escena de una actriz y ademas cantente llamada Bethany "Joy Lenz-Galeotti" interpreta "Elsewhere" original de Sarah McLachlan



Esta seria hasta un par de meses la daban en fox life aqui en Chile, ya no :(.

--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

miércoles, 11 de noviembre de 2009

como saber quien llama a un metodo con c#

Actualmente tengo un problema en testeo que no tengo en produccion y me vi en la necesidad de hacer una traza de quien llama al metodo, asi que aproveche el impulso e hice un metodo que me muestre todos los metodos que se llamaron.

Aqui esta el metodo:


using System;
using System.Diagnostics;
private static string GetCallerName() {
var trace = new StackTrace();
var texto = Environment.NewLine;
var i = 1;
foreach (var stackFrame in trace.GetFrames()){
texto += string.Format("{0}) {1} Of {2} {3}", i, stackFrame.GetMethod().Name, stackFrame.GetMethod().ReflectedType.FullName, Environment.NewLine);
i++;
}
return texto;
}


y nos retorna algo de de este estilo:

1) GetCallerName Of ZeusNet.Core.Model.Domain.Ops.Laytimes.LaytimeCalculationPortItem
2) set_DemurrageRate Of ZeusNet.Core.Model.Domain.Ops.Laytimes.LaytimeCalculationPortItem
3) _InvokeMethodFast Of System.RuntimeMethodHandle
4) InvokeMethodFast Of System.RuntimeMethodHandle
5) Invoke Of System.Reflection.RuntimeMethodInfo
6) Invoke Of System.Reflection.RuntimeMethodInfo
7) SetValue Of System.Reflection.RuntimePropertyInfo
8) SetValue Of System.Reflection.RuntimePropertyInfo
9) Set Of NHibernate.Property.BasicSetter
10) SetPropertyValues Of NHibernate.Persister.AbstractEntityPersister
11) InitializeEntity Of NHibernate.Impl.SessionImpl
12) InitializeEntitiesAndCollections Of NHibernate.Loader.Loader
13) DoQuery Of NHibernate.Loader.Loader
14) DoQueryAndInitializeNonLazyCollections Of NHibernate.Loader.Loader
15) LoadCollection Of NHibernate.Loader.Loader
16) LoadCollection Of NHibernate.Loader.Loader
17) Initialize Of NHibernate.Loader.OneToManyLoader
18) Initialize Of NHibernate.Collection.AbstractCollectionPersister
19) InitializeCollection Of NHibernate.Impl.SessionImpl
20) Initialize Of NHibernate.Collection.PersistentCollection
21) GetEnumerator Of NHibernate.Collection.Bag
22) GetEnumerator Of NHibernate.Collection.Generic.GenericBag`1
23) ExistVoyageItineraryPort Of ZeusNet.Core.Model.Domain.Ops.Laytimes.LaytimeCalculation
24) Update Of ZeusNet.Core.Model.Domain.Ops.Laytimes.LaytimeCalculation
25) CurrentLaytimeCalculation Of ZeusNet.Core.Presentation.Operations.Laytime.LayTimeCalculators.LaytimeCalculatorPresenter
26) LoadData Of ZeusNet.Core.Presentation.Operations.Laytime.LayTimeCalculators.LaytimeCalculatorPresenter
27) LoadFixtures Of ZeusNet.Core.Presentation.Operations.Laytime.LayTimeCalculators.LaytimeCalculatorPresenter
28) LoadCharterers Of ZeusNet.Core.Presentation.Operations.Laytime.LayTimeCalculators.LaytimeCalculatorPresenter
29) _InvokeMethodFast Of System.RuntimeMethodHandle
30) InvokeMethodFast Of System.RuntimeMethodHandle
31) Invoke Of System.Reflection.RuntimeMethodInfo
32) Invoke Of System.Reflection.RuntimeMethodInfo
33) InvokeJoinpoint Of Spring.Aop.Framework.AbstractMethodInvocation
34) Proceed Of Spring.Aop.Framework.AbstractMethodInvocation
35) Execute Of Accendra.AFC.Platform.Aop.UnitOfWorkInterceptorCommand
36) ExecuteCommand Of Accendra.AFC.Platform.Context.WorkContext
37) RunUnitOfWork Of Accendra.AFC.Platform.Context.WorkContext
38) Invoke Of Accendra.AFC.Platform.Aop.UnitOfWorkInterceptor
39) Proceed Of Spring.Aop.Framework.AbstractMethodInvocation
40) Invoke Of Accendra.AFC.Platform.Aop.LogInterceptor
41) Proceed Of Spring.Aop.Framework.AbstractMethodInvocation
42) Invoke Of Spring.Aop.Framework.DynamicProxy.BaseCompositionProxy
43) LoadCharterers Of Spring.Aop.DynamicProxy.Proxy_cc2f84dc90a44991a4513fe3d0405c0d
44) VoyageChanged Of Operations_Laytime_LaytimeCalculator
45) OnSelectedIndexChanged Of System.Web.UI.WebControls.ListControl
46) RaisePostDataChangedEvent Of System.Web.UI.WebControls.DropDownList
47) System.Web.UI.IPostBackDataHandler.RaisePostDataChangedEvent Of System.Web.UI.WebControls.DropDownList
48) RaiseChangedEvents Of System.Web.UI.Page
49) ProcessRequestMain Of System.Web.UI.Page
50) ProcessRequest Of System.Web.UI.Page
51) ProcessRequest Of System.Web.UI.Page
52) ProcessRequestWithNoAssert Of System.Web.UI.Page
53) ProcessRequest Of System.Web.UI.Page
54) ProcessRequest Of ASP.operations_laytime_laytimecalculator_aspx
55) System.Web.HttpApplication.IExecutionStep.Execute Of System.Web.HttpApplication+CallHandlerExecutionStep
56) ExecuteStep Of System.Web.HttpApplication
57) ResumeSteps Of System.Web.HttpApplication+ApplicationStepManager
58) ResumeStepsFromThreadPoolThread Of System.Web.HttpApplication
59) ResumeStepsWithAssert Of System.Web.HttpApplication+AsyncEventExecutionStep
60) OnAsyncEventCompletion Of System.Web.HttpApplication+AsyncEventExecutionStep
61) Complete Of System.Web.HttpAsyncResult
62) PollLockedSessionCallback Of System.Web.SessionState.SessionStateModule
63) TimerCallback_Context Of System.Threading._TimerCallback
64) runTryCode Of System.Threading.ExecutionContext
65) ExecuteCodeWithGuaranteedCleanup Of System.Runtime.CompilerServices.RuntimeHelpers
66) RunInternal Of System.Threading.ExecutionContext
67) Run Of System.Threading.ExecutionContext
68) PerformTimerCallback Of System.Threading._TimerCallback


Claro la mayoria de los metodos no tengo idea para que son, pero solo sabiendo algunos y ahora se el orden en que se ejecutaron :D
--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

viernes, 6 de noviembre de 2009

THE MOST[El puente]

Aqui hay un video, es un cortometraje que ha ganado varios premios. lo vi ayer en el asi somos, lo mostro el salfate.

Es realmente bueno el video. da mucho que pensar.

Aqui dejo el video.



--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

miércoles, 4 de noviembre de 2009

Problema de posicionamiento de calendario DHTML con Internet Explorer

Si bien personalmente me da lo mismo  que sea vea bien en internet explorer, los clientes no piensan igual :(.

En el proyecto en el cual trabajo en mi trabajo, tenemos el calendario de http://www.dynarch.com/ . y nos encontramos con el problema que en IE, cuando la pagina tiene scroll, no determina bien la posicion.

buscando por ahi llegamos a esto. tuvimos que cambiar la forma de leer el scroll. tenia estas lineas, mas menos en la linea 1393 del archivo calendar.js.



if (Calendar.is_ie) {
br.y += document.body.scrollTop;
br.x += document.body.scrollLeft;
} else {
br.y += window.scrollY;
br.x += window.scrollX;
}

y la dejamos asi ahora.

if (Calendar.is_ie) {
br.y += window.scrollY;
br.x += window.scrollX;
} else {
br.y += window.scrollY;
br.x += window.scrollX;
}

Claramente es if, no tiene sentido, pero lo deje con unos comentarios en svn, para saber que toque algo ahi en ese codigo :D.



--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

viernes, 23 de octubre de 2009

Selinium & UpdatePanel[WaitForXXXXXX]

Selenium , es una aplicacion para hacer test automaticos, simula  acciones de usuarios en un navegador. mas adelante me metere mas en lo que es selinum y ventajas de usar una herramienta como esta.

Bueno en selenium tenemos varios comandos. por el ejemplo el type, click, typeAndWait, ClickAndWait.
bueno la direferencia entre el clickAndWait y click es que el AndWait espera que se recarge la pagina.

Pero con los update panels no recarga la pagina completa, entonces no me sirve  un click ni tampoco un clickAndWait.

En  Selinium Existe la forma de que quede esperando una accion "WaitForXXXXX" , por ejemplo podemos decirle a selenium que espere a que un elemento este habilidado, esto es super bueno si tenemos peteciones http  asincronicas y despues de esto habilitamos un control.  pero con los updatepanel, no siempre hay una accion visible atravez del un control[amenos que pongamos el tipico div de "Cargando"].

Entonces existe el comando WaitForCondicion, donde uno especifica un script javascript mas un tiempo de timeout. para el caso de los updatepanel, vemos que se haya registrado el Endrequest  de la pagina de la siguiente forma esto si estamos con el plugin de firefox:



var busyFunc = selenium.browserbot.getCurrentWindow().Sys.WebForms.PageRequestManager.get_inPostBack;
busy = (busyFunc == null)?true:busy = busyFunc();
busy == false;


En mi caso el test en html quedo asi:
waitForCondition
"var busyFunc = selenium.browserbot.getCurrentWindow().                       Sys.WebForms.PageRequestManager.get_inPostBack;       busy = (busyFunc == null)?true:busy = busyFunc();       busy == false;"
300
En el caso que se programaticamente, para incluilo en un test unitario y luego incluirlo en Cruise control.

selenium.WaitForCondition( "var busyFunc = selenium.browserbot.getCurrentWindow().Sys.WebForms.PageRequestManager.get_inPostBack; busy = (busyFunc == null)?true:busy = busyFunc(); busy == false;", "10000");

--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

miércoles, 21 de octubre de 2009

Post Blog Numero 100 :D

Hace mas de 2 años parti con mi blog.
aun recuerdo mi primer Post que tiempos aquellos, el objetivo de este blog si bien es personal,  sige teniendo el mismo objetivo, "compartir varias cosas, en especial sobre programacion". por lo generar e posteado cosas mas bien cotidianas.

Para sorpresa mia durante todo este tiempo e tenido muchas visitas.  13 seguidores,   y bastantes comentarios,

Pretendo seguir adelante con este Blog. tratar de poner mas entradas, siempre sobre cosas que me pasan dia a dia, y como siempre poniendole algo de humor.

Como ya dije arriba es un blog personal, pero me sorprende la cantidad de visitas. si bien no me interesa mucho esto,  es rico saber que hay gente lee tu blog, o que al buscar xxxx palabra aparece en Google.  en marzo del 2008 puse Google Analytics. y aqui dejo unas imagenes con la cantidad de visitas.

Gracias a los que leen el blog :D.







--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

martes, 13 de octubre de 2009

Select dinamicos de Pais/Regiones/Ciudad/Comunas con php y javascript

el ejemplo esta aqui

siempre se pide en todos lados general select anidados, de que si se seleciona x pais el combo de ciudades tiene que llenarse dependiendo del pais.

Aqui hice un ejemplo con php, javascript usando mochikit, y Json.

el codigo es totalmente reutilizable, aspectos importantes:

- En header.php esta la coneccion a la DB.
- Se uso json_encode para formar un arreglo de json por cada fila. esto ya es una funcion nativa en las ultimas versiones de php.
- Se generan elementos html dinamicamente con javascript. usando mochikit.
- Se conectan con mochkit los select, al momento de hacer onchange, mediante signal.

Aqui esta el codigo


<?php require_once ("header.php");


$arregloPaises = array();
$arregloRegiones = array();
$arregloCiudades = array();
$arregloComunas = array();

$query_paises = "select idpais as id, descripcion as nombre from paises";
$query_regiones = "select id as id, descripcion as nombre ,idpais as idpais from regiones";
$query_ciudades = "select id as id, descripcion as nombre ,idregion as idregion from ciudades";
$query_comunas = "select id as id, descripcion as nombre ,idciudad as idciudad from comunas";

$result_paises = mysql_query($query_paises);
$result_regiones = mysql_query($query_regiones);
$result_ciudades = mysql_query($query_ciudades);
$result_comunas = mysql_query($query_comunas);

while ($result_paises && $row = mysql_fetch_object($result_paises))
$arregloPaises[] = $row;
while ($result_regiones && $row = mysql_fetch_object($result_regiones))
$arregloRegiones[] = $row;
while ($result_ciudades && $row = mysql_fetch_object($result_ciudades))
$arregloCiudades[] = $row;
while ($result_comunas && $row = mysql_fetch_object($result_comunas))
$arregloComunas[] = $row;

$paisesJS = json_encode($arregloPaises);
$regionesJS = json_encode($arregloRegiones);
$ciudadesJS = json_encode($arregloCiudades);
$comunasJS = json_encode($arregloComunas);
?>
<html>
<head>
<script src="js/mochikit.js"></script>

<script>
var paises = <?=$paisesJS?>;
var regiones = <?=$regionesJS?>;
var ciudades = <?=$ciudadesJS?>;
var comunas = <?=$comunasJS?>;

function getRegionesByPais(idpais){
var newArreglo = [];
for (var i=0;i<regiones.length;i++)
if (regiones[i].idpais==idpais)
newArreglo.push(regiones[i]);
return newArreglo;
}

function getCiudadesByRegion(idregion){
var newArreglo = [];
for (var i=0;i<ciudades.length;i++)
if (ciudades[i].idregion==idregion)
newArreglo.push(ciudades[i]);
return newArreglo;
}

function getComunasByCiudad(idciudad){
var newArreglo = [];
for (var i=0;i<comunas.length;i++)
if (comunas[i].idciudad==idciudad)
newArreglo.push(comunas[i]);
return newArreglo;
}

function setDataSource(obj,items){
var arreglo = getElementsByTagAndClassName("option",null,obj);
for (var i=0;i<arreglo.length;i++)
removeElement(arreglo[i]);
if (items!=null)
for (var i=0;i<items.length;i++)
appendChildNodes(obj, OPTION({'value':items[i].id},null,items[i].nombre));
}

addLoadEvent(
function(){
setDataSource($('pais'),paises);

connect ($('pais'),"onchange", function (elem){
setDataSource($('region'),getRegionesByPais(elem.target().value));
setDataSource($('ciudad'),null);
setDataSource($('comuna'),null);
}
);
connect ($('region'),"onchange", function (elem){
setDataSource($('ciudad'),getCiudadesByRegion(elem.target().value));
setDataSource($('comuna'),null);
}
);
connect ($('ciudad'),"onchange", function (elem){
setDataSource($('comuna'),getComunasByCiudad(elem.target().value));
}
);
});
</script>
</head>
<body>
<select id="pais" name="pais"></select>
<br>
<select id="region" name="region"/></select>
<br>
<select id="ciudad" name="ciudad"/></select>
<br>
<select id="comuna" name="comuna"/></select>
<br>

</body>
</html>



y la base de datos es la siguiente:


CREATE TABLE `ciudades` (
`ID` int(11) NOT NULL auto_increment,
`DESCRIPCION` varchar(30) default NULL,
`IDREGION` int(11) default NULL,
PRIMARY KEY (`ID`)
) ;

CREATE TABLE `paises` (
`IDPAIS` int(11) NOT NULL auto_increment,
`DESCRIPCION` varchar(30) default NULL,
PRIMARY KEY (`IDPAIS`)
);

CREATE TABLE `regiones` (
`ID` int(11) NOT NULL auto_increment,
`DESCRIPCION` varchar(30) default NULL,
`IDPAIS` int(11) default NULL,
PRIMARY KEY (`ID`)
);

CREATE TABLE `comunas` (
`ID` int(11) NOT NULL auto_increment,
`DESCRIPCION` varchar(30) default NULL,
`IDCIUDAD` int(11) default NULL,
PRIMARY KEY (`ID`)
);


y aqui algunos datos para probar:


INSERT INTO `ciudades` VALUES (1, 'Iquique', 1);
INSERT INTO `ciudades` VALUES (2, 'Antofagasta', 2);
INSERT INTO `ciudades` VALUES (3, 'Copiapo', 3);
INSERT INTO `ciudades` VALUES (4, 'La Serena', 4);
INSERT INTO `ciudades` VALUES (5, 'Valparaiso', 5);
INSERT INTO `ciudades` VALUES (6, 'Rancagua', 6);
INSERT INTO `ciudades` VALUES (7, 'Talca', 7);
INSERT INTO `ciudades` VALUES (8, 'Concepcion', 8);
INSERT INTO `ciudades` VALUES (9, 'Temuco', 9);
INSERT INTO `ciudades` VALUES (10, 'Osorno', 10);
INSERT INTO `ciudades` VALUES (11, 'Aysen', 11);
INSERT INTO `ciudades` VALUES (12, 'Magallanes', 12);
INSERT INTO `ciudades` VALUES (13, 'Santiago', 13);
INSERT INTO `ciudades` VALUES (14, 'Valdivia', 14);
INSERT INTO `ciudades` VALUES (15, 'Arica', 15);
INSERT INTO `ciudades` VALUES (17, 'santiago2', 13);





INSERT INTO `comunas` VALUES (1, 'Alto Hospicio', 1);
INSERT INTO `comunas` VALUES (2, 'Pica', 1);
INSERT INTO `comunas` VALUES (3, 'Taltal', 2);
INSERT INTO `comunas` VALUES (4, 'Mejillones', 2);
INSERT INTO `comunas` VALUES (5, 'Caldera', 3);
INSERT INTO `comunas` VALUES (6, 'Copiapo', 3);
INSERT INTO `comunas` VALUES (8, 'La Serena', 4);
INSERT INTO `comunas` VALUES (9, 'Casablanca', 5);
INSERT INTO `comunas` VALUES (10, 'Quintero', 5);
INSERT INTO `comunas` VALUES (11, 'Rancagua', 6);
INSERT INTO `comunas` VALUES (13, 'Rio Claro', 7);
INSERT INTO `comunas` VALUES (14, 'Constitucion', 7);
INSERT INTO `comunas` VALUES (15, 'Lota', 8);
INSERT INTO `comunas` VALUES (16, 'Coronel', 8);
INSERT INTO `comunas` VALUES (18, 'Temuco', 9);
INSERT INTO `comunas` VALUES (19, 'Rio Negro', 10);
INSERT INTO `comunas` VALUES (20, 'Puyehue', 10);
INSERT INTO `comunas` VALUES (21, 'Guaitecas', 11);
INSERT INTO `comunas` VALUES (22, 'Cisnes', 11);
INSERT INTO `comunas` VALUES (35, 'San Miguel', 13);
INSERT INTO `comunas` VALUES (24, 'Punta Arenas', 12);
INSERT INTO `comunas` VALUES (25, 'Quinta Normal', 13);
INSERT INTO `comunas` VALUES (26, 'Pudahuel', 13);
INSERT INTO `comunas` VALUES (27, 'Santiago', 13);
INSERT INTO `comunas` VALUES (28, 'Renca', 13);
INSERT INTO `comunas` VALUES (29, 'Las Condes', 13);
INSERT INTO `comunas` VALUES (30, 'Providencia', 13);
INSERT INTO `comunas` VALUES (31, 'Paillaco', 14);
INSERT INTO `comunas` VALUES (32, 'Corral', 14);
INSERT INTO `comunas` VALUES (33, 'Camarones', 15);
INSERT INTO `comunas` VALUES (34, 'Arica', 15);





INSERT INTO `paises` VALUES (1, 'Chile', 3);
INSERT INTO `paises` VALUES (3, 'Argentina', 6);
INSERT INTO `paises` VALUES (4, 'Bolivia', 16);
INSERT INTO `paises` VALUES (5, 'Venezuela', 15);
INSERT INTO `paises` VALUES (6, 'Colombia', 11);
INSERT INTO `paises` VALUES (7, 'Japon', 10);
INSERT INTO `paises` VALUES (8, 'Cuba', 12);
INSERT INTO `paises` VALUES (9, 'Mexico', 7);
INSERT INTO `paises` VALUES (10, 'austria', 2);
INSERT INTO `paises` VALUES (12, 'aaaa', NULL);



INSERT INTO `regiones` VALUES (1, 'I region', 1);
INSERT INTO `regiones` VALUES (2, 'II region', 1);
INSERT INTO `regiones` VALUES (3, 'III region', 1);
INSERT INTO `regiones` VALUES (4, 'IV region', 1);
INSERT INTO `regiones` VALUES (5, 'V region', 1);
INSERT INTO `regiones` VALUES (6, 'VI region', 1);
INSERT INTO `regiones` VALUES (7, 'VII region', 1);
INSERT INTO `regiones` VALUES (8, 'VIII region', 1);
INSERT INTO `regiones` VALUES (9, 'IX region', 1);
INSERT INTO `regiones` VALUES (10, 'X region', 1);
INSERT INTO `regiones` VALUES (11, 'XI region', 1);
INSERT INTO `regiones` VALUES (12, 'XII region', 1);
INSERT INTO `regiones` VALUES (13, 'Metropolitana', 1);
INSERT INTO `regiones` VALUES (14, 'XIV region', 1);
INSERT INTO `regiones` VALUES (15, 'XV region', 1);


En resumen, el codigo es bastante chico, usando json, mochikit, nos queda con un html muy limpio, solo conectamos los select al momento de cargar la pagina.


--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

lunes, 5 de octubre de 2009

about:mozilla El Libro de Mozilla

hace tiempo, encontre por ahi y puse en la barra de direcciones "about:mozilla" al igual que cuando uno pone "about:config" para configurar los paremetros de firefox, y sale lo siguienre




aqui dejo Textual lo que aparece en wikipedia con respecto a esta frase:
La frase "Mammon se durmió" hace referencia a que MS Internet Explorer se quedó estancada en la versión 6.0 durante 5 años. "la bestia renació" hace referencia a que Netscape renació en la compañía AOL (al menos hasta el 9.0.0.5). "propagándose por toda la tierra y sus seguidores se hicieron legión" a que luego de renacer Netscape, se expandió a todo el globo y sus seguidores se hicieron millones rápidamente. "y proclamaron nuevos tiempos" a que en el futuro los navegadores ya no estarían tan ligados a Internet Explorer, sino que existirían nuevas posibilidades. "sacrificaron cosechas con fuego, con la astucia de zorros" esto hace referencia (directamente) a Firefox ya que su logo es un zorro de fuego, de ahí el nombre "Firefox". "Y construyeron un nuevo mundo a su propia imagen como prometían las palabras sagradas" se refiere a que la Fundación Mozilla liberó los códigos fuente de sus productos. "Mammon se despertó" se refiere al lanzamiento de la versión 7 de IE, "y súbitamente no era más que un rezagado" se refiere a que explorer de ser un innovador, paso a copiar características de firefox que explorer carecía.
El número del pasaje, 11:9, puede hacer referencia al 9 de noviembre (11-9 en la nomenclatura anglosajona). El 9 de noviembre de 2004 salió a la luz Mozilla Firefox 1.0. Tendría que ver con el renacer de la bestia en cuanto al hecho de crear el primer ejecutable estable de lo que fue la Bestia y que hoy es Firefox.

Aqui esta el link a wikipedia para mas informacion


--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

martes, 29 de septiembre de 2009

[Humor]Encuentra la diferencia



Click para agrandar las imagenes.

Alguien encontro la diferencia???, este post, es para molestar a paul [compañero de trabajo y amigo], llevamos mucho tiempo diciendole que cambie su telefono[Adivinen cual es el de el, el de la izquieda :D]. el de la derecha es de Gabriel,. esta excelente el nuevo Iphone 3GS. alguien dia voy a ir por el mio, Felicitaciones Gabriel, y Paul cambia el cel, jajajajaja.

--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

lunes, 28 de septiembre de 2009

buscando en listas con c#, list.Find o list.FindAll

Tengo en la base de datos todos los feriados, los tengo con año 2000 todos, y en una lista tengo todos los feriados entre en rango de fechas.

Tengo una fecha[en realidad varias] y necesito saber si es un dia feriado o no. por que no pregunto a la base de datos, por que estoy en un bucle, y hacer una consulta por cada dia es muy costoso, asi que me traigo los feriados al inicio del proceso con un rago de tiempo.

Aai que tuve que usar FindAll de la clase List, y usar delegate para esto. esto me retorna una lista con los objetos que coinciden con la condicion aqui el codigo:

var holiday = foo.FindAll(
delegate(Holiday hol){
return (hol.Date.Value.Day == newdateTime.Day
&& hol.Date.Value.Month == newdateTime.Month); });

if (holiday.Count > 0)
log.Info(string.Format("{0} es un feriado", newdateTime));


como todos los feriados se guardan en año 2000 y la fechas que estoy generando puede ser de cualquier año, tengo que preguntar por el mes y el dia, foo, es una lista de Holidays.

Estoy trabajando con el Framework 2, si estuviera con el 3, podria usar lamda, que seria asi.

var holiday= foo.FindAll(
hol => (hol.Date.Value.Day == newdateTime.Day
&& hol.Date.Value.Month == newdateTime.Month));

Tambien hay otra forma, pero aun no la entiendo mucho :(

var bar = public Predicate<holiday> checkHoliday(DateTime date){ return delegate(Holiday item) { return item.Date.Value.Day == date.Day && item.Date.Value.Month == date.Month; };}
foo.FindAll(checkHoliday(newdateTime));
si bien retorna un delegate, en la firma del metodo retona un Predicate, me imagino que hace un cast o algo por el estilo.




--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

domingo, 27 de septiembre de 2009

Vendo mi auto, suzuki Aerio SX 2005

vendo mi auto un suzuki Aerio SX, aqui detallo las descripciones:
Marca:         Suzuki.
Modelo: Aerio SX.
Año: 2005.
motor: 1.6.
Color: Beige.
Kilometraje: 61.500.
Radio: radio aiwa, con CD[no lee mp3], cable auxiliar frontal.
Espejos: Electricos
Cierre Centralizado
Precio: $4.300.000.

Soy el segundo dueño, yo no se mucho de autos, lo lleve a un mecanico y me dijo que estaba impecable, el kilometraje es real, lo uso solo los fin de semanas.

Si a alguien le interesa mandar un correo a vhspiceros@gmail.com y/o llamar a 9 349 95 95.

Aqui aqui varias fotos[hacer click para agrandar]:






--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

miércoles, 23 de septiembre de 2009

saber dia de la semana en c#

en el trabajo tengo un requerimiento que tiene que desplegar el dia de la semana de x fecha.

En .net es super simple solo hay que darle un formato,al metodo tu string tambien acepta una cultura.

Aqui algunos ejemplos


public String dayOfWeek(DateTime? date){
return date.Value.ToString("ddd");
}


esto nos retorna el nombre corto[si lo podemos llamar asi],Wed,sun,etc,etc.

Si queremos que nos entrege el nombre completo es cosa de pasarle otro formato al metodo tu string.

public String dayOfWeekLarge(DateTime? date){
return date.Value.ToString("dddd");
}

Esto nos mostraria por ejemplo Wednesday

El el idioma que nos muestre los dias, depende la configuracion regional de nuestros equipos o servidor, si no esta configurado en ninguna parte la configuracion, esto por lo general se configura en el web.config.

si queremos asegurarnos por ejemplo que siempre lo muestre en español seria cosa de asignarle la cultura. de la siguiente forma:


public String dayOfWeek(DateTime? date){
return date.Value.ToString("ddd",new CultureInfo("es-ES"));
}

Esto ultimo tanto para "ddd" y "dddd"

--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

lunes, 21 de septiembre de 2009

Gadgets de Twitter donde quieras, incluso en Blogger.

En la mañana si se fijaron agrege un gadget que tiene los ultimos tweet's que he escrito en twitter. esto al lado derecho de la pantalla.

no lo hice con el gadget de blogger, si no que lo hice con codigo html y javascript que encontre encontre por ahi.

Aqui esta el codigo:

<div id="twitter_div">
<ul id="twitter_update_list"></ul>
<a href="http://twitter.com/vhspiceros" id="twitter-link" style="display:block;text-align:right;">
    follow me on Twitter
  </a>
</div>
<script type="text/javascript" src="http://twitter.com/javascripts/blogger.js"></script>
<script type="text/javascript" src="http://twitter.com/statuses/user_timeline/vhspiceros.json?callback=twitterCallback2&count=2"></script>
Donde dice vhspiceros tiene que poner su nombre de usuario. esto funciona no solo en blogger, si no que en cualquier pagina. mediante Css, esto queda bastante bonito.

y otra cosa importante, donde dice count=2, el 2 quiere decir cuantos elementos queremos mostrar. en este caso 2:D

--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

lunes, 14 de septiembre de 2009

Recuperar clave de usuarios en prestaShop

estoy instanlando prestashop para un trabajo para la universidad. y perdi la clave del administrador. al final instale prestaShop como 3 veces. hasta que encontre una forma de cambiar la clave.

Es super facil.
Key de la cookie
existe un archivo "settings.inc.php" en el directorio "config" en mi caso tiene la siguiente informacion.

define('_DB_SERVER_', 'localhost');
define('_DB_TYPE_', 'MySQL');
define('_DB_NAME_', 'prestashop');
define('_DB_USER_', 'root');
define('_DB_PASSWD_', '*****');
define('_DB_PREFIX_', 'ps');
define('__PS_BASE_URI__', '/prestashop/');
define('_THEME_NAME_', 'prestashop');
define('_COOKIE_KEY_', 'Cm8RnxXYYSstej4vivXHmut5zStOXqaasbC48YTm05WKhsQLPIynwTau');
define('_COOKIE_IV_', 'GsDtE6N5');
define('_PS_CREATION_DATE_', '2009-09-06');
define('_PS_VERSION_', '1.2.1.0');


y simplemente copiamos el valor de "_COOKIE_KEY_" en este caso el "Cm8RnxXYYSstej4vivXHmut5zStOXqaasbC48YTm05WKhsQLPIynwTau"

Restaurando la clave
A travez de phpmuadmin o caulquier cliente sql.
hacemos el siguiente update

update ps_employee set passwd=md5("Cm8RnxXYYSstej4vivXHmut5zStOXqaasbC48YTm05WKhsQLPIynwTauclavenueva") where email='vhspiceros@gmail.com';


listo ahora el usuario con email vhspiceros@gmail.com quedo con la clave "clavenueva".

Fijarse que la clave esta encriptada bajo md5




--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

viernes, 11 de septiembre de 2009

Les parece familiar???


Update gracias a Lester Fibla.



--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

jueves, 10 de septiembre de 2009

Volviendo a VIM :D

En realidad a Gvim.

Hace bastante que no usaba este editor, ya sea en windows o linux. ayer lo instale y me trajo muy buenos recuerdos. Tengo que hacer un proyecto en php[hace mucho que no veia nada en PHP], y se me olvidados varios comandos.

Para windows GVim se puede bajar desde aqui

Ayer despues de hacer bastante memoria y buscar en varios blogs, volvi a mi configuracion de hace unos años :D. aqui pongo mi _vimrc


set nocompatible
source $VIMRUNTIME/vimrc_example.vim
source $VIMRUNTIME/mswin.vim
behave mswin
set tabstop=4
set shiftwidth=4
set expandtab
set textwidth=8
set autoindent
set gfn=Consolas:h8:cANSI
colorscheme darkblue
set nu
set diffexpr=MyDiff()
function MyDiff()
let opt = '-a --binary '
if &diffopt =~ 'icase' | let opt = opt . '-i ' | endif
if &diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif
let arg1 = v:fname_in
if arg1 =~ ' ' | let arg1 = '"' . arg1 . '"' | endif
let arg2 = v:fname_new
if arg2 =~ ' ' | let arg2 = '"' . arg2 . '"' | endif
let arg3 = v:fname_out
if arg3 =~ ' ' | let arg3 = '"' . arg3 . '"' | endif
let eq = ''
if $VIMRUNTIME =~ ' '
if &sh =~ '\<cmd'
let cmd = '""' . $VIMRUNTIME . '\diff"'
let eq = '"'
else
let cmd = substitute($VIMRUNTIME, ' ', '" ', '') . '\diff"'
endif
else
let cmd = $VIMRUNTIME . '\diff'
endif
silent execute '!' . cmd . ' ' . opt . arg1 . ' ' . arg2 . ' > ' . arg3 . eq
endfunction


--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

martes, 8 de septiembre de 2009

insert a partir de un select

Necesita poblar una tabla que recien estaba creando, con datos que ya tenia en una tabla. pero no queria darme la lata de llenarla a mano, y recorde que una vez habia hecho esto. pero siempre se me olvida :(

El ejemplo mas basico.

insert into Country (name) (select 'hola')


Y aqui el ejemplo un poco mas completo,

insert into pais(name)
(select distinct(pais) from persona)

Esto se puede hacer con mas campos, lo importante es que coincidan la cantidad y tipos de datos tanto de datos a ingresar como los del select.

--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

lunes, 24 de agosto de 2009

Backup & Restore en sql Server

para hacer los respaldos es relativamente facil, yo lo hago con el siguiente Script


ALTER DATABASE testVictor SET SINGLE_USER WITH ROLLBACK IMMEDIATE
BACKUP DATABASE testVictor TO DISK = 'c:\testVictor.bak'
ALTER DATABASE testVictor SET MULTI_USER


nos deja un lindo archivo en c: :D.


Restaurar este archivo es un poco mas complicado yo siempre lo hacia de la siguiente forma:


USE MASTER;
ALTER DATABASE testVictor SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
RESTORE DATABASE testVictorFROM DISK='c:\testVictor.bak' WITH REPLACE


Esto funciona de perillas, hasta el fin de semana, el viernes me pasaron un respaldo de un servidor y al hacer esto me reclamaba por unas rutas, estos backup tienen asociados archivos tanto de log como de Data. los cuales no los tenia en mi pc. pero esto no es tan terrible hay una forma de ver los arhivos que tiene un archivo.bak.


RESTORE FILELISTONLY FROM DISK = 'C:\testVictor.bak'

y esto nos retorna lo siguiente:

LogicalName PhysicalName Type FileGroupName Size MaxSize FileId CreateLSN DropLSN UniqueId ReadOnlyLSN ReadWriteLSN BackupSizeInBytes SourceBlockSize FileGroupId LogGroupGUID DifferentialBaseLSN DifferentialBaseGUID IsReadOnly IsPresent
-------------- -------------------------------------------------------------------------- ------- ---------------- ---------- -------------- --------- ------------ ---------- ------------------------------------ -------------- --------------- -------------------- ------------------ -------------- --------------- ---------------------- ------------------------------------ ------------- ------------
bd_testVictor_data C:\Program Files\Microsoft SQL Server\MSSQL.2\MSSQL\Data\testVictor.mdf D PRIMARY 1092616192 35184372080640 1 0 0 6D0F05F4-7825-462C-B7A4-75145464A721 0 0 1092550656 512 1 (null) 25413000000659900042 0CCB361A-F307-4868-BD93-5A86878225C3 false true
bd_testVictor_log C:\Program Files\Microsoft SQL Server\MSSQL.2\MSSQL\Data\testVictor_log.df L (null) 1511325696 2199023255552 2 0 0 27985F15-05F1-45DE-8D89-A88C9756CACF 0 0 0 512 0 (null) 0 00000000-0000-0000-0000-000000000000 false true


Ahora teniendo los arhivos. podemos decirle al restore que estos archivos los deje en una ruta valida, que nosotros queramos.


use master;
RESTORE DATABASE testVictor
from DISK = N'c:\testvictor.bak'
WITH MOVE 'bd_testVictor_data' TO 'C:\Program Files\Microsoft SQL Server\MSSQL.2\MSSQL\Data\testVictor.mdf',
MOVE 'bd_testVictor_log' TO 'C:\Program Files\Microsoft SQL Server\MSSQL.2\MSSQL\Data\testVictor_log.df';


y listo ya esta listo el restore y Backup de una base de datos
--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

martes, 11 de agosto de 2009

estudio, estudio, estudio el final cada vez mas cerca

como muchos ya saben, estoy estudiando Ingenieria de software en la universidad de las Americas. y como tambien muchos saben no le pego mucho al tema del estudio.

aqui estan mis notas :(

BASE DE DATOS..............................: 5,4
MÉTODOS MATEMÁTICOS APLICADOS..............: 4,1
CÁLCULO DIFERENCIAL........................: 4,1

LENGUAJES DE PROGRAMACIÓN..................: 6,6
ESTADÍSTICA I..............................: 5,5
INGENIERÍA ECONÓMICA.......................: 6.1
ALGEBRA LINEAL.............................: 3.4

SISTEMAS OPERATIVOS........................: 6,0
ELECTROMAGNETISMO..........................: 4,0
LABORATORIO DE ELECTROMAGNETISMO...........: 4,5


Actualmento estoy tomando estos ramos:
Programacion WEB[php], Ingenieria de software y Algrebra Lineal.


Para el proximo bimestre que que empieza en noviembre tengo los siguientes ramos.
Electivo[.NET], proyecto de Titulo, y Calculo Integral[lo tuve que botar 2 veces:(]


Asi que si todo sale bien salgo este año. Ojala :D.


--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

viernes, 31 de julio de 2009

Haciendo respaldos automaticos, parte II

Siguiendo con este post.

como no cacho mucho python , ese lo desarrolle en python 2.5, pero un compañero trato de ejecutarlo en 3.1 y no funciono, al perecen en el cambio de versiones cambio la forma de capturar las exepciones. aqui dejo el programa solucionado para la version 3.1. aun no menejo las excepciones solo muestro un texto "Error Controlado" :( .


import os
import shutil
import datetime

date = datetime.date.today()
dateDelete = date - datetime.timedelta(weeks=2)

sourcePath = r'F:\develop\zeus\trunk'
destRootPath = r'U:\respaldoAutomaticos'
destPath = destRootPath + "\\" + str(date) + " _respaldo"

print ("find old Directories")
try:
print (dateDelete)
for directory in os.listdir(destRootPath):
try:
array = directory.split(" ")[0].split("-")
dateDir = datetime.date(int(array[0]), int(array[1]), int(array[2]))
print (dateDir)
if dateDir < dateDelete:
print ("try drop Directory" + destRootPath + "\\" + directory)
shutil.rmtree(destRootPath + "\\" + directory)
print ('Directory "' + destRootPath + "\\" + directory + '" Deleted')
except Exception:
print ("Error Controlado")
except Exception:
print ("Error Controlado")

for root, dirs, files in os.walk(sourcePath):
dest = destPath + root.replace(sourcePath, '')
if not os.path.isdir(dest):
os.mkdir(dest)
print ('Directory created at: ' + dest)
for f in files:
oldLoc = root + '\\' + f
newLoc = dest + '\\' + f
if not os.path.isfile(newLoc):
try:
shutil.copy2(oldLoc, newLoc)
print ('File ' + f + ' copied.')
except IOError:
print ('file "' + f + '" already exists')






--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

viernes, 24 de julio de 2009

Enviando correo con c# y gmail

Estuve tratando de enviar correos desde c#, es bastante facil, con el framework 3.x. en los frameworks anteriores es muy parecido, solo cambian algunos metodos, por ejemplo el TO es un string donde separamos por coma los destinatarios, en el 3 es una lista. pero no hay mucha diferencias significativas entre un framework y otro.




public void sendMail{
var msg = new MailMessage();
msg.To.Add("vhspiceros@gmail.com");
msg.From = new MailAddress("vhspiceros@gmail.com", "victor hugo Saavedra", Encoding.UTF8);
msg.Subject = "Prueba de correo a GMail";
msg.SubjectEncoding = Encoding.UTF8;
msg.Body = "Cuerpo del mensaje";
msg.BodyEncoding = Encoding.UTF8;
msg.IsBodyHtml = false;
msg.Attachments.Add(new Attachment(@"c:\foo.txt"));
var client = new SmtpClient{
Credentials = new NetworkCredential("vhspiceros@gmail.com", "******"),
Port = 587,
Host = "smtp.gmail.com",
EnableSsl = true,
};
try{
client.Send(msg);
}
catch (SmtpException ex){
Console.WriteLine(ex.Message);
Console.ReadLine();
}
}

--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

martes, 21 de julio de 2009

Gandalf??

Hace mucho que no posteo, he estado vuelto loco con la universidad, tratando de salvar todos los ramos, y recuperar los atrasados, para lograr salir este año de la universidad :).

Aquí dejo una foto, que encontré por ahi, esta genial, todavía me rió :D.



--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

viernes, 10 de julio de 2009

Haciendo respaldos automaticos

Buscando y buscando no entre ningun programa que pudiera generar respaldos automaticos en windows. en linux con la linea de comando seria bastante sencillo hacerlo.

Asi que me aburri de buscar y empeze a buscar y desarrollar en python, el resultado de esto fue bastante bueno. Aqui dejo el codigo


import os
import shutil
import datetime

date = datetime.date.today()
dateDelete = date - datetime.timedelta(weeks=4)

sourcePath = r'F:\develop\trunk'
destRootPath = r'U:\respaldoAutomaticos'
destPath = destRootPath + "\\" + str(date) + " _respaldo"

print ("find old Directories")
try:
for directory in os.listdir(destRootPath):
try:
array = directory.split(" ")[0].split("-")
dateDir = datetime.date(int(array[0]), int(array[1]), int(array[2]))
if dateDir < dateDelete:
print ("try drop Directory" + destRootPath + "\\" + directory)
shutil.rmtree(destRootPath + "\\" + directory)
print ('Directory "' + destRootPath + "\\" + directory + '" Deleted')
except Exception, e:
print e
except Exception, e:
print e

for root, dirs, files in os.walk(sourcePath):
dest = destPath + root.replace(sourcePath, '')

if not os.path.isdir(dest):
os.mkdir(dest)
print ('Directory created at: ' + dest)

for f in files:
oldLoc = root + '\\' + f
newLoc = dest + '\\' + f

if not os.path.isfile(newLoc):
try:
shutil.copy2(oldLoc, newLoc)
print ('File ' + f + ' copied.')
except IOError:
print ('file "' + f + '" already exists')

y para automatizar estos respaldos simplemento lo agregamos a las tareas programadas de windows y listo.

Como funciona: Toma una carpeta de origen y la deja en una de destino, en mi caso "U:\respaldoAutomaticos" es una unidad de red :D.

En el destino crea una carpeta con la fecha mas un texto, esto nos sirve para eliminar los respaldos antiguos.

cada vez que se ejecute el programa en dias distinto, genera un respaldo completo en una nueva carpeta.

Ademas borra los respaldos anteriores a 4 semanas. Asi no gastamos mucho espacio en respaldo.

Por Mejorar: Estoy pensando en implementar una variación, que deje en el destino solo un único respaldo, copiando solo los archivos modificados y nuevos, este vendría siendo otro programa, por que personalmente a mi me interesa tener varias respaldos.

En fin tenemos nuestro programa de respaldo automático o backup automáticos que funciona en windows.

por ultimo el tema del performance, anda super bien, por eso no comprimí el archivo, para que mientras respalde podemos seguir usando nuestra estación de trabajo sin problema.




--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

lunes, 22 de junio de 2009

Haciendo Drag & Drop con Mochikit

Hacer drag & drop con mochikit, es relativamente facil.

Hace unos dias hice un ejemplo bastante sencillo. y con pocas lineas de javascript podia hacer que se arastratan unos divs o lo que sean hacia otro div.

El planteamiento para hacer esto es, hay que crear uno o mas elementos Draggable, y por otra parte crear elementos Droppable aqui definimos todos los elementos que puede permitir tener esta seccion[esta discriminacion la hace por la clase CSS asignada].

Y despues simplemente lo conectamos, nuestras funciones para que cree los elementos al cargar la pagina, en mochikit esto se hace con addLoadEvent.


Aqui dejo el codigo, el codigo casi habla por si solo.

addLoadEvent(function (){
createDrag();
createDrop();
});

function createDrag(){
var arreglo = getElementsByTagAndClassName(null,"draggable");
for (var i = 0;i < arreglo.length;i++){
new Draggable(arreglo[i],{revert:true,
handle: false,
starteffect: MochiKit.Visual.Opacity,
endeffect: MochiKit.Visual.Opacity,
zindex: 1000,
setclass: null,
ghosting: null,
onchange: MochiKit.Base.noop,
scroll: false,
scrollSensitivity: 20,
scrollSpeed: 15 });
}
}

function createDrop(){
var arreglo = getElementsByTagAndClassName(null,"droppable");
for (var i = 0;i < arreglo.length;i++){
new Droppable(arreglo[i], {
accept: ['draggable'],
ondrop: function (element,dropElement,ev) {
appendChildNodes(dropElement,element);
log("llamando a servicios");
}
});
}
}




mochikit nos simplifica mucho la vida, el hacer esto a solo javascript, me imagino que no debe ser tan trivial, y con mochikit pareciera que si lo fuera.

Nota: getElementsByTagAndClassName y $ son de mochikit, una busca un tag especifico que tenga X clase Css, y el otro es el renombramiento de getElementById como esta aqui.
--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

martes, 16 de junio de 2009

Cambio en la encuesta II

La encuesta anterior ¿En que Lenguaje te gusta mas programar?, con un total de 178 votos se redistrubuyeron de la siguiente forma

C# 90 (50%)
Java 56 (31%)
Javascript 36 (20%)
C/C++ 23 (12%)
Vbscript 17 ( 9%)
Python 11 ( 6%)
Pascal 10 ( 5%)
Cobol 10 ( 5%)
Ruby 9 ( 5%)

Y ahora nueva encuesta como es costumbre,

¿Que prefieres Escuchar mientras Trabajas?

--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

lunes, 15 de junio de 2009

Sushi en Familia

Este fin de semana, con mi señora se nos ocurrio hacer sushi en casa.

de aqui sacamos las receta. y de aqui como hacer el arroz.

no voy a poner la receta ni nada, por que en internet esta lleno de como hacer el arroz, y los rollitos de sushi

no nos quedaron muy bonitos, pero si muy ricos. aqui dejo algunas fotitos.



Eso los hice yo :(. nunca a sido mi fuerte las manualidades.



En pleno proceso de armado.

uno que otro ingrediente, Arroz, palta, salmon, camarones, zanahoria, queso, cebollines, y obvio la infaltable bebida.

Estos ya quedaron mas bonitos

Pero a algunos le pusimos el queso arriba, jajajajajaja. Aunque no sacamos fotos, tuvimos la osadia de hacer Palta maki sushi envuelto en palta. quedaron bien ricos tambien.


--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

viernes, 12 de junio de 2009

Doblandole la mano a los updatePanels de AjaxcontrolToolkit y javascript

Tenia que hacer que un texbox de .net se vieran y escribieran con mayuscula.

Hasta ningun problema, con css se puede hacer sin problema, y al momento de guardar en la DB hago un Uppercase, y estoy listo dije yo.

Hice una pequeña funcion , en javascript que lo hiciera, por que no eran textbox nativos ni de html ni de webform, eran de webform ya extendidos.

function changeUpperCaseCss(){
var textBox= $('<%=txtNombre.ClientID %>');
textBox.style.textTransform = 'uppercase';
}


listo, ahora solo me quedaba conectar el elemento en el onload, de la siguiente forma con mochikit.

addLoadEvent(
function (){
changeUpperCaseCss();
}
);


Funcionaba todo de maravilla, pero el problema el maldito updatePanel, cada vez que se refrescaba el panel, se perdia o refrescaba el texbox, entonces perdia la propiedad textTransform que le habia puesto con javascript.

para solucionar esto tuve que usar el javascript que tiene el ajaxControlToolkit
de la siguiente forma

Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);
function EndRequestHandler(sender, args) {
changeUpperCaseCss();
}


Que hace esto, primero optiene la instacia PageRequestManager. y definimos la funcion EndRequestHandler esta funcion se llamara cada vez que se termine el request producido por un update panel.

Asi quedo soluciona. y todo en el Cliente :D
--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

Ordenando por fechas en c# :D

Siguiendo con este post.

Aqui Ordenamos una lista de objetos por fecha. la gran diferencia que solo usamos DateTime.Compare. Este lo ordena de forma acendente.

var personas = getAllPersonas();
personas.Sort(new Comparison(
delegate(persona a, persona b) {
return DateTime.Compare((DateTime)a.fechaNac, (DateTime)b.fechaNac);
}));


Si lo queremos ordenar de forma descendente simplemente cambiamos el orden de comparacion :D de esta forma.


var personas = getAllPersonas();
personas.Sort(new Comparison(
delegate(persona a, persona b) {
return DateTime.Compare((DateTime)b.fechaNac, (DateTime)a.fechaNac);
}));

--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

miércoles, 10 de junio de 2009

bonito el Logo, Banco Estado



Igualito al de nuestro querido Firefox.


aun no cacho si es legal modificarlo de esa forma.
--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

martes, 26 de mayo de 2009

miércoles, 13 de mayo de 2009

¿En Dicom por $89?

Encontre por ahi esto. sera real??




--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

jueves, 30 de abril de 2009

problemas con Identity al insertar datos

Hoy tuve un problema, tenia que traerme unos datos de una base de datos.

hasta ahi nungun problema, genere el script con el Aqua data Studio y se veia todo bien. pero cuando trate de insertarlo en otra base de datos me reclamo por el indentity. y claro los insert exportados traian el id por cada fila.

Entonces averiguando por ahi, ese identity se puede desactivar de la siguiente forma:


SET IDENTITY_INSERT [dbo].[PERSON] ON
GO
INSERT INTO [dbo].[PERSON]([Id], [CreateDate])
VALUES(1, '20090428 17:01:00')
GO
SET IDENTITY_INSERT [dbo].[PERSON] OFF
GO


y listo el insert se ejecuto correctamente. lo que si me llama la atencion que a simple vista el ON y el OFF estan al revez, pero estan bien.

mi sentido comun dice que deberia ser alrevez pero bueno.


Esto es para Sql Server


--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

miércoles, 15 de abril de 2009

[Electromagnetismo] clase 3

Aqui adjunto algunos videos .

me falto uno pero pesa mucho, pesa 150MB ylo maximo permitido en blogger es de 100 MB :(












--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

martes, 7 de abril de 2009

Problema de Fisolofos, comunicacion entre procesos

En mi Clase de sistema operativo, nos dieron una tarea, es el tipico ejemplo de los filosofos, donde hay 5 filosofos, y solamante 4 tenedores. la idea es optimizar la comunicacion entre los procesos y optimizalos.

Cada filoso puede comer siempre y cuando tenga 2 tenedores asi que por logica, como maximo pueden haber 2 filosos comiendo, y el resto pensando, meditando o espera, como quieran llamarle.


Aqui hay ejemplo en C, que encontramos muy bueno.

#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#define N 5 /*num. de filosofos*/
#define IZQ (i-1)%N /*vecino izquierdo de i*/
#define DER (i+1)%N /*vecino derecho de i*/
#define PENSANDO 0
#define CON_HAMBRE 1
#define COME 2

pthread_t filos[N]; /*hilos que representan a los filósofos*/
sem_t mutex ; /*semáforo para la sección crítica*/
sem_t s[N]; /*semáforos para los filósofos*/
int estado [N] ; /*estado actual de cada filósosfo*/


/*
el filosofo i va a perder el tiempo... (va a pensar)
*/
void pensar (int i)
{
int t ;
t = rand() % 11;
printf("Filosofo %d pensando \n", i) ;
estado[i] = PENSANDO;
sleep (t) ;
}


/*
El filosofo i, va a comer !!!!!!!!
*/
void comer (int i)
{
printf("Filósofo %d esta comiendo un caballo \n", i);
estado[i] = COME;
sleep (5);
}


/*
Verifica que pueda tomar ambos tenedores
*/
void verifica(int i)
{
if( estado[i]==CON_HAMBRE && estado[IZQ]!=COME && estado[DER]!=COME ){
estado[i] = COME;
printf("Filósofo %d comiendo\n", i) ;
sem_post(&s[i]);
}
}


/*
El filosofo i intenta tomar los tenedores
*/
void toma_tndrs(int i)
{

sem_wait(&mutex); /*entra a la sección crítica, hace uso del semaforo*/
estado[i] = CON_HAMBRE; /*ice: tengo mucha hambre!!!!!!!!!!*/
verifica(i); /*verifica que pueda tomar los tenedores*/
sem_post(&mutex); /*sale de la sección crítica y el sem. puede permitir la entrada a alguien más*/
sem_wait(&s[i]); /*se bloquea si no consiguió los tenedores*/
}


/*
el filosofo i dejará los tenedores
*/
void deja_tndrs(int i)
{

sem_wait(&mutex); /*de nuevo entra a la sección critica*/
estado[i] = PENSANDO; /*deja de comer y se pone a pensar*/
verifica(IZQ);
verifica(DER);
sem_post(&mutex);
}


void * filosofos (int i)
{
int j ;


for (; ; )
{
pensar(i) ;
toma_tndrs(i) ;
comer(i) ;
deja_tndrs(i) ;
}
}


main()
{
int i ;


for(i = 0; i < 5; i++){
sem_init (&s[i], 0, 1);


estado[i] = PENSANDO ;
}


sem_init (&mutex, 0, 1);

/*creamos un hilo de ejecucion para cada filosofo, que ejecuta filosofos()*/
for (i=0; i<N; i++)
pthread_create(&filos[i], NULL, (void *)filosofos,(void *) i);

/*cada hilo espera a que terminen los demás y libera los recursos*/
for (i=0; i<N; i++){
pthread_join(filos[i],NULL);
}

}






--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

lunes, 30 de marzo de 2009

buscar textos en procemientos almacenados.

hace unos dias, vi aun compañero de trabajo buscar texto en los procedimientos almacenados. que es bastante util, cuando queremos ver cuando se hace un insert a una tabla o cosas por el estilo.


select SUBSTRING(text,0,40) from syscomments where text like '%textoABuscar%'


Remplazen el "textoABuscar" por lo que quieran buscar.

esto es para Sql Server



--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

martes, 24 de marzo de 2009

Backups automáticos en SQL Server 2005

hoy estuve con Paul, un compañero de trabajo cuestienandonos la mejor forma de hacer respaldos en Sql Server de forma Automatica.

primero hay que generar un script al cual llamaremos backup.sql y lo crearemos en c:\

DECLARE @fecha VARCHAR(50)
DECLARE @archivo VARCHAR(50)
SET @fecha = CONVERT(VARCHAR(4), YEAR(GETDATE()))+'-'+ CONVERT(VARCHAR(2), MONTH(GETDATE()))+'-'+CONVERT(VARCHAR(2), DAY(GETDATE()))
SET @archivo = 'C:\tmp\BD_'+ @fecha +'.bak'
ALTER DATABASE BD SET SINGLE_USER WITH ROLLBACK IMMEDIATE
BACKUP DATABASE BD TO DISK = @archivo
ALTER DATABASE BD SET MULTI_USER
GO
EXIT


Ojo en hay que Cambiar DB por el nombre de la base de datos. Ademas este script cambia la Db a "MULTI USER".

luego crearemos backup.bat, con el siguiente contenido

SQLCMD -S(local)\SQLEXPRESS -E -i"C:\backup.sql"
"C:\Archivos de programa\WinRAR\rar" a BACKUP.rar c:\TMP\*.*
ECHO S | DEL c:\TMP


Utilizamos la utilidad SQLCMD para que ejecute en backup.sql en x servidor.
Aqui hay un manual de SQLCMD

Ahora solo es cosa de programar una tarea cada x tiempo para que ejecute el bat
--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

martes, 10 de marzo de 2009

Svn Diff View mi primer proyecto openSource :) .

Svndiffview es una aplicacion bastanta pequeña, pero con una utilidad bien especifica.

Svndiffview es un site que sirve para ver las diferencias entre una revision contra la revision anterior. su uso es muy simple. Ademas las diferencias entre archivos las muestra de forma bastante intuitiva y amistosa.

Se hizo en python, con pySvn. esta bajo Django.
Ademas por costumbre se uso mochikit para js, ya que es una libreria muy poderosa.

Aqui ahi mas info de la aplicacion http://code.google.com/p/svndiffview/

Use como base para este desarrollo, un proyecto open source llamado codeflow, desarrollado por Leo Soto.

Bueno aqui les dejo unas capturas de la aplicacion.













--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

viernes, 6 de marzo de 2009

Un proyecto no solo es programar[Herramientas de apoyo]

Muchas veces un proyecto se complica o facilita independiente de que el equipo tenga un nivel tecnico alto. Para facilitar cosas Anexas al desarrollo existen varias herramientas de automatizacion y de apoyo, la mayoria son openSource,Free o como quieran llamarles.

Aqui detallo algunas que por lo menos para mi son fundamentales, a lo mejor voy a estar muy orienta a .net.

Sistema de control de versiones:
Hay muchos cvs, ,Svn, soursafe, etc. pero el que mas sobresale es Svn. la gracia de usar Svn serian
  • Codigo respaldado.
  • Posibilidad de trabajar en equipo.
  • Posibilidad de tener acceso a todo el historial de cambios, por archivo o proyecto completo.
  • poder volver atras en cambios que pudiesen estar malos.
Para mi ya seria muy complicado trabajar sin svn, o algun sistemas de estos, mas cuando trabajas en equipo.[aun recuerdo mi primer trabajo donde no existia nada de eso, y se me perdian a menudo los fuentes :)].
Esto no importa en el lenguaje que trabajes solo almacena historial de texto, en el caso de svn, creo que tiene modulos para mesclar word y esas cosas.

Test Unitario:
Lo mismo que lo anterior, existen para java, .Net. pero siempre bajo el mismo concepto y comportamiento. [JUnit, NUnit].
Estos test se programan, y nos sirven para asegurar que nuestros codigos nos retornen resultados esperados. de aqui sale la programación orientada a los test.

Logger :
Si logger no blogger :). muchas veces e visto sistemas que no tienen ningun tipo de log. y que nisiquiera requistran las excepciones. para Java tenemor log4J para .NET tambien tenemos Log4NEt. para punto net tambien existe la Enterprise Library que tambien sirve para hacer log entre muchas otras cosas, no he visto mucho de esto.

FxCop:
Una Herramienta Microsoft para ver buenas practicas de programación. uno le da una dll, y el nos dice que cosas deberiamos mejorar, como por ejemplo no capturar Excepciones genericas, por dar un ejemplo.
Uno puedes crear o quitar nuevas reglas, viene cargado por defecto con muchas reglas asi que hay que sacarle varias, que por lo menos prefiero usar mas el sentido comun en algunas.

Cruise Control:
Es una herramienta comúnmente utilizada en integración continua Si no usamos esa metodologia. de igual forma es muy importate en un proyecto.
CC esta para Java y para .net. Este es un Ant, es decir, realiza tareas programadas, lo que podemos hacer con CC:
  • Bajar las ultimas fuentes de nustros repositorios.
  • Compilar.
  • Ejecutar los test, hechos en Nunit o Junit respectivamente.
  • Comprobar reglas con fxcop o simililar para otro lenguaje o plataforma.
  • CheckStyles. No se como todavia, pero existe forma en java de comprobar los membretes, comentarios de las clases tenga cierta Estructura.
  • Generar Release ,instaladores, publicaciones.
  • Envio de mails, con resultados de cada proceso[configurable].
Antes C.C. era un plus para las empresas de desarrollo, ahora es casi un standard.


Wiki, Base de Conocimientos, Blog:
Es importante que el conocimiento o expertis de los desarrolladores quede plasmado en algun lado. existen muchas formas cada uno elige la mas apropiada o intuitiva.
Ademas es bueno poner datos relevantes en estas herramientas, como descripcion de servidores, base de datos, etc.



Resumen:
En resumen, un proyecto no solo se define con saber programar, mas aun si es un equipo de trabajo grande. El que se use estas herramientas tampoco no dara un exito, si no que hay que saberlas usar y sacar partido a cada una de ellas.
implantar estas cosas es relativamente facil, y el beneficio es mucho, asi no nos preocupamos de cosas anexas al desarrollo.









--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

lunes, 9 de febrero de 2009

mi primer sort con un Delegate :)

Alguna vez hace mucho tube que ordenar, pero lo hice de una forma muy poco eficiente.
Actualmente estoy con c# framework 2.

La forma de ordenar es super simple aqui Dejo un ejemplo:

list.Sort(
delegate(Persona foo, Persona bar){
return foo.Edad.CompareTo(bar.edad);
});


Para el framework 3 podemos usar expresines lambda de esta forma.


list.Sort(
(foo, bar) => foo.Edad.CompareTo(bar.Edad));


--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com