Bitcoin

BitMiner - free and simple next generation Bitcoin mining software

lunes, julio 02, 2007

Equipo de Tecnosis MX

Marteen, Chu-cho, Jerry, Tadeo-chan, Mikeshot

Original en | Scenes from a memory

martes, junio 26, 2007

Redimencionar una Imagen en PHP

Tomando en cuenta lo anterior aqui hay una funcion que cumple con ese objetivo:

function redimensionar($original,$destino,$anchura)
{
//calculamos la altura proporcional
$datos = getimagesize($original);
$ratio = ($datos[0] / $anchura);
$altura = round($datos[1] / $ratio);
// esta será la nueva imagen reescalada
$thumb = imagecreatetruecolor($anchura,$altura);
$img = imagecreatefromjpeg($original);

// con esta función la reescalamos
imagecopyresampled ($thumb, $img, 0, 0, 0, 0, $anchura, $altura, $datos[0], $datos[1]);
// la guardamos con el nombre y en el lugar que nos interesa.
imagejpeg($thumb,$destino);
}

Guardar una imagen y su miniatura a un campo Blob de mysql

El siguiente codigo no es mio, pero hace mas de dos años programe un modulo así, es muy interesante.

Para crear la miniatura necesitamos la Librería Gráfica GD, en este script estamos usando la versión 2.0.28 de esta librería.

Si esta librería está activada, en el phpinfo() debe salir algo como esto:

Si no la tenemos activada solo tenemos que modificar el archivo php.ini que se encuentra en C:\Windows (puede variar según tu versión de Windows), y agregar la línea extension=php_gd2.dll en la sección "Dynamic Extensions". El archivo php_gd2.dll debe estar en la carpeta "extensions" dentro del directorio donde instalaste el php, por ejemplo "C:\php\extensions". Si no tienes el archivo php_gd2.dll, te lo puedes descargar aquí.

Desarrollo del Script

El formulario de upload y el script php está en una sola página, la nombré como blob.php, empezemos entonces:



php:
<?php
// Verificamos que el formulario no ha sido enviado aun
$postback = (isset($_POST["enviar"])) ? true : false;

if($postback){
// Nivel de errores
error_reporting(E_ALL);
// Constantes
# Altura de el thumbnail en píxeles
define("ALTURA", 100);
# Nombre del archivo temporal del thumbnail
define("NAMETHUMB", "/tmp/thumbtemp"); //Esto en servidores Linux, en Windows podría ser:
// define("NAMETHUMB", "c:/windows/temp/thumbtemp"); y te olvidas de los problemas de permisos
# Servidor de base de datos
define("DBHOST", "localhost");
# nombre de la base de datos
define("DBNAME", "test");
# Usuario de base de datos
define("DBUSER", "root");
# Password de base de datos
define("DBPASSWORD", "");
// Mime types permitidos
$mimetypes = array("image/jpeg", "image/pjpeg", "image/gif", "image/png");
// Variables de la foto
$name = $_FILES["foto"]["name"];
$type = $_FILES["foto"]["type"];
$tmp_name = $_FILES["foto"]["tmp_name"];
$size = $_FILES["foto"]["size"];
// Verificamos si el archivo es una imagen válida
if(!in_array($type, $mimetypes)) die("El archivo que subiste no es una imagen válida");
// Creando el thumbnail
switch($type) {
case $mimetypes[0]:
case $mimetypes[1]:
$img = imagecreatefromjpeg($tmp_name);
break;
case $mimetypes[2]:
$img = imagecreatefromgif($tmp_name);
break;
case $mimetypes[3]:
$img = imagecreatefrompng($tmp_name);
break;
$datos = getimagesize($tmp_name);
$ratio = ($datos[1]/ALTURA);
$ancho = round($datos[0]/$ratio);
$thumb = imagecreatetruecolor($ancho, ALTURA);
imagecopyresized($thumb, $img, 0, 0, 0, 0, $ancho, ALTURA, $datos[0], $datos[1]);
switch($type) {
case $mimetypes[0]:
case $mimetypes[1]:
imagejpeg($thumb, NAMETHUMB);
break;
case $mimetypes[2]:
imagegif($thumb, NAMETHUMB);
break;
case $mimetypes[3]:
imagepng($thumb, NAMETHUMB);
break;
}

// Extrae los contenidos de las fotos
# contenido de la foto original
$fp = fopen($tmp_name, "rb");
$tfoto = fread($fp, filesize($tmp_name));
$tfoto = addslashes($tfoto);
fclose($fp);
# contenido del thumbnail
$fp = fopen(NAMETHUMB, "rb");
$tthumb = fread($fp, filesize(NAMETHUMB));
$tthumb = addslashes($tthumb);
fclose($fp);
// Borra archivos temporales si es que existen
@unlink($tmp_name);
@unlink(NAMETHUMB);
// Guardamos todo en la base de datos
#nombre de la foto
$nombre = $_POST["nombre"];
$link = mysql_connect(DBHOST, DBUSER, DBPASSWORD) or die(mysql_error($link));;
mysql_select_db(DBNAME, $link) or die(mysql_error($link));
$sql = "INSERT INTO tabla(nombre, foto, thumb, mime) VALUES ('$nombre', '$tfoto', '$tthumb', '$type')";
mysql_query($sql, $link) or die(mysql_error($link));
echo "Fotos guardadas";
exit();
}

?>


html:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Imagen a Blob</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<form name="frmimage" id="frmimage" method="post"
enctype="multipart/form-data" action="<?php echo $_SERVER['PHP_SELF'];?>">
Nombre: <input type="text" id="nombre" name="nombre" /><br />
Imagen: <input type="file" id="foto" name="foto" /><br />
<input type="submit" name="enviar" id="enviar" value="Guardar" />
</form>
</body>
</html>

Fuente

lunes, junio 18, 2007

Identificar en PHP si se Usa Internet Explorer

Como me molesta el tener que validar cosas especiales para Internet Explorer en mis webs... ya que es el que no cumple con los estandares, tan bonito que es el FireFox, pero bueno.. aqui una funcion para saber si se usa Internet Explorer.


if (strstr($_SERVER["HTTP_USER_AGENT"], "MSIE"))
{
echo "Usas Internet Explorer";
}
?>

viernes, junio 08, 2007

Manual de Stored Procedures en MySQL

http://www.web-media.com.au/images/mysql-logo.gif

Desde esta página pueden encontrar un manual PDF en inglés muy bueno, donde aprenderemos el manejo de Stored Procedures en MySQL 5.x, ya que no es tan facil conseguir estos tipos de manuales. Creanme, si tienen más acepto aportaciónes.

Libros AJAX, JavaScript, CSS, XHTML en Linea

No se puede mostrar la imagen “http://www.librosweb.es/website/css/images/ajax_ppn.jpg” porque contiene errores.No se puede mostrar la imagen “http://www.librosweb.es/website/css/images/intro_js_libro.jpg” porque contiene errores.
No se puede mostrar la imagen “http://www.librosweb.es/website/css/images/miniportada_css.jpg” porque contiene errores.No se puede mostrar la imagen “http://www.librosweb.es/website/css/images/miniportada_xhtml.jpg” porque contiene errores.

La web llamada librosweb.es, nos da la oportunidad de aprender 4 lenguajes con los cuales podemos DOMINAR EL MUNDO... bueno, eso diría cerebro a pinky... yo solo les puedo decir que son la base de toda Web 2.0... y si aprendemos a manejarlos Dominaremos el mercado web... por lo menos en nuestra zona :-D.

A APRENDER TECNOSIS, no nos quedemos atras...

PD. A ver a que hora aportan mas temas... :@

viernes, junio 01, 2007

Cargar Windows XP sobre Linux Ubuntu

Ya tienes ubuntu instalado y como te gusta?

Ya tienes XGL funcionando y tus amigos Windowseros se mueren de envidia de como se hacen gelatina tus menus, ventanas y todo?

Pero aun tienes una partición de Windows porque te dejan tarea en Autocad, te mandan trabajos con WordArt y no se ve muy lindo con OpenOffice? Te da miedo que necesites Windows un dia y no tenerlo instalado? (Asi como los condones, mejor tenerlos y no usarlos que necesitarlos y no tenerlos)

Pues ya podrás deshacerte de tu partición de Windows, Si asi es, gracias a este tutorial para instalar VMWare Server, con el cual, podremos instalar Windows XP en nuestro ubuntu, Antes utilizaba VMWare Player pero esto es mucho mejor:

cubowindowslinux

windowsonlinux

Esto es solamente para poner a trabajar una Máquina Virtual en un escritorio local, por lo que omito la parte de administración remota. El Fin de esto es simplemente instalar Windows XP en nuestro ubuntu. Si deseas ejecutar tareas un poco mas avanzadas, sería buena idea seguir este otro en tutorial howtoforge hasta la segunda parte, de administración remota.

Ok, comencemos entonces. Primero instalaremos algunos paquetes necesarios, dependiendo de los paquetes que tengamos y los que no, esto puede tardar cierto tiempo. para esto abrimos una consola y ejecutamos:

sudo apt-get install linux-headers-`uname -r` build-essential xinetd

(Este paso es indispensable para continuar, por lo menos en mi caso, si ya tienes estas herramientas úedes omitir este paso, aunque no se incluía oficialmente en el how-to; y es básicamente instalar las fuentes del kernel que estoy usando, mas herramientas de compilación)

sudo apt-get install linux-kernel-headers libx11-6 libx11-dev libxtst6 xlibs-dev xinetd wget

sudo apt-get install gcc binutils-doc cpp-doc gcc-4.0-locales make manpages-dev autoconf automake1.9 libtool flex bison gdb gcc-doc gcc-4.0-doc libc6-dev-amd64 lib64gcc1

En cuanto se instalen podremos continuar con el siguiente paso, que es crear una carpeta para nuestras máquinas Virtuales, si tu estas usando VMWare Player no debes tocar tu partición Virtual Ok:

sudo mkdir /var/vm

Ahora debemos obtener VMWare Server, que es gratuito (almenos por ahora). Para eso vamos a la página: http://www.vmware.com/download/server/ donde debemos registrarnos (gratuitamente) para obtener un serial (que será necesario durante la instalación).

a continuación se nos presenta un vínculo para descargar VMWare, sin embargo al ser un archivo de 100MB, es buena idea usar wget, o usar DDM. la forma sencilla es dar click derecho en el vínculo y seleccionar “copiar dirección del enlace” para despues pegarlo en la consola, precedido de wget; en mi caso y para la versión que estaba disponible al momento de la descarga, el comando era:

wget http://download3.vmware.com/software/vmserver/VMware-server-1.0.0-28343.tar.gz

Es importante copiar nuevamente la dirección en lugar de usar el comando anterior exactamente como está, porque asi nos aseguramos de tener la versión mas reciente.

Dependiendo de tus amigos de VTR esto puede durar varios minutos o unas horas, asi que hay que tomarselo con calma es buena idea prepararse un Café o tomarse unas Chelas para el calor.

Una vez descargado, debemos descomprimirlo, en mi caso el comando usado fué:

tar xvfz VMware-server-1.0.0-28343.tar.gz

De nueva cuenta, si la versión que descargaste no concuerda, modificala para que se ajuste a tu caso. la forma sencilla de hacerlo es escribir hasta server y despues presionar la tecla tab para autocompletar.

Despues de que se hayan descomprimido los chorrocientosmil archivos contenidos en el tar, debemos cambiarnos al interior de la carpeta recien desempaquetada:

cd vmware-server-distrib

y ahora, para instalar el programa, ejecutamos el script de instalación… pero como super usuario (yo lo hice con sudo sin mayor problema; aunque algunos dicen debe ser como root)

sudo ./vmware-install.pl

esto inicia el script de instalación, que nos hará una serie de preguntas a las que debemos responder. Aqui copiaré lo que indica el how-to original, ya que es muy acertado:

Creating a new installer database using the tar3 format.

Installing the content of the package.

In which directory do you want to install the binary files?
[/usr/bin] <– /usr/bin

What is the directory that contains the init directories (rc0.d/ to rc6.d/)?
[/etc] <– /etc

What is the directory that contains the init scripts?
[/etc/init.d] <– /etc/init.d

In which directory do you want to install the daemon files?
[/usr/sbin] <– /usr/sbin

In which directory do you want to install the library files?
[/usr/lib/vmware] <– /usr/lib/vmware
The path “/usr/lib/vmware” does not exist currently. This program is going to
create it, including needed parent directories. Is this what you want? [yes] <– yes

In which directory do you want to install the manual files?
[/usr/share/man] <– /usr/share/man

In which directory do you want to install the documentation files?
[/usr/share/doc/vmware] <– /usr/share/doc/vmware
The path “/usr/share/doc/vmware” does not exist currently. This program is going
to create it, including needed parent directories. Is this what you want?
[yes] <– yes

The installation of VMware Server 1.0.0 build-28343 for Linux completed
successfully. You can decide to remove this software from your system at any
time by invoking the following command: “/usr/bin/vmware-uninstall.pl”.

Before running VMware Server for the first time, you need to configure it by
invoking the following command: “/usr/bin/vmware-config.pl”. Do you want this
program to invoke the command for you now? [yes] <– yes

Making sure services for VMware Server are stopped.

Stopping VMware services:
Virtual machine monitor done

You must read and accept the End User License Agreement to continue.
Press enter to display it.


….. snip [LICENCE TEXT] ……

Do you accept? (yes/no) <– yes
Thank you.

Configuring fallback GTK+ 2.4 libraries.

In which directory do you want to install the mime type icons?
[/usr/share/icons] <– /usr/share/icons

The path “/usr/share/icons” does not exist currently. This program is going to
create it, including needed parent directories. Is this what you want? [yes] <– yes

What directory contains your desktop menu entry files? These files have a
.desktop file extension. [/usr/share/applications] <– /usr/share/applications

The path “/usr/share/applications” does not exist currently. This program is
going to create it, including needed parent directories. Is this what you want?
[yes] <– yes

In which directory do you want to install the application’s icon?
[/usr/share/pixmaps] <– /usr/share/pixmaps

(En la siguiente sección, la instalación no encontró un modulo apropiado para mi, asi que lo compiló. en realidad solo fue necesario:

1) indicar la ruta al código fuente del kernel, en mi caso: /usr/src/linux-headers-2.6.17-10-Generic/include ; hay que notar que esto puede variar considerablemente con las diversas actualizaciones, asi que será necesario verificarlo antes de indicar cualquier cosa.

2) establecer el compilador a usar (acepté los valores por omisión y funcionaron sin mayor problema).

Despues de eso, no fue necesario proporcionar mas información a este respecto, aunque fue necesario compilar algunas otras cosas en el proceso, pero esto ya se realizó de manera automática)

Trying to find a suitable vmmon module for your running kernel.

The module bld-2.6.17-10-generic loads perfectly in the running
kernel.

Do you want networking for your virtual machines? (yes/no/help) [yes] <– yes

Configuring a bridged network for vmnet0.

The following bridged networks have been defined:

. vmnet0 is bridged to eth0

All your ethernet interfaces are already bridged.

Do you want to be able to use NAT networking in your virtual machines? (yes/no)
[yes] <– yes

Configuring a NAT network for vmnet8.

Do you want this program to probe for an unused private subnet? (yes/no/help) <– yes
Probing for an unused private subnet (this can take some time)…

The subnet 192.168.246.0/255.255.255.0 appears to be unused.

The following NAT networks have been defined:

. vmnet8 is a NAT network on private subnet 192.168.246.0.

Do you wish to configure another NAT network? (yes/no) [no] <– no

Do you want to be able to use host-only networking in your virtual machines?
[yes] <– yes

Configuring a host-only network for vmnet1.

Do you want this program to probe for an unused private subnet? (yes/no/help)
[yes] <– yes

Probing for an unused private subnet (this can take some time)…

The subnet 172.16.37.0/255.255.255.0 appears to be unused.

The following host-only networks have been defined:

. vmnet1 is a host-only network on private subnet 172.16.37.0.

Do you wish to configure another host-only network? (yes/no) [no] <– no

Trying to find a suitable vmnet module for your running kernel.

(aqui es donde fue necesario compilar el otro módulo, pero por omisión tomólos valores proporcionados en el comentario anterior. En caso de que no fuera asi, solo es necesario repetir las respuestas)

The module bld-2.6.17-10-Generic loads perfectly in the running
kernel.

Please specify a port for remote console connections to use [902] <– 902

Stopping internet superserver: xinetd.
Starting internet superserver: xinetd.
Configuring the VMware VmPerl Scripting API.

Building the VMware VmPerl Scripting API.

Using compiler “/usr/bin/gcc”. Use environment variable CC to override.

Installing the VMware VmPerl Scripting API.

The installation of the VMware VmPerl Scripting API succeeded.

Generating SSL Server Certificate

In which directory do you want to keep your virtual machine files?
[/var/lib/vmware/Virtual Machines] <– /var/vm

Please enter your 20-character serial number.

Type XXXXX-XXXXX-XXXXX-XXXXX or ‘Enter’ to cancel: <– Tu Serial de VMware Server

Starting VMware services:
Virtual machine monitor done
Virtual ethernet done
Bridged networking on /dev/vmnet0 done
Host-only networking on /dev/vmnet1 (background) done
Host-only networking on /dev/vmnet8 (background) done
NAT service on /dev/vmnet8 done

The configuration of VMware Server 1.0.0 build-28343 for Linux for this running
kernel completed successfully.

Ok ya tienes VMWare instalado en tu ubuntu. Ahora, para correrlo, está disponible en Aplicaciones / herramientas del sistema / VMWare server console.

Ahora falta instalar Windows; pero todos ustedes han instalado Win alguna vez en su vida no me vengan con cuentos a mi ok.

En todo caso el procediendo es este

Install enter

Siguiente, siguiente, siguiente, etc, etc, etc… y asi .

...Finalizar

Extraido tal cual de | antofalinux.cl

jueves, mayo 24, 2007

PHP y MySQL Videotutoriales (Imagen ISO)

Para mayor facilidad en el aprendizaje de PHP y MySQL ahora me encuentro con varios video tutoriales unidos en una imagen ISO.

Quieres iniciar desde CERO, esta es la opcion que te lleva de la mano hasta el maravilloso mundo de la programación Web.

Descarga Directa

Seguímos en Línea.

Curso de Ajax en Videotutoriales (Imagen ISO)

Aqui tienen 20 VideoTutoriales reunidos en una imagen ISO, todos los videotutoriales son extraidos gratuitamente de la web Séptimo Continente.

Tienes el futuro a tu alcance, pues Ajax da agilidad y mejor presentación a tus páginas web. ¿Quieres un Ejemplo?... Google es el mejor que existe, sus aplicaciones como la nueva version de Analytics esta creada con Ajax dandonos a nosotros como usuarios una gran interactividad con el sitio. Y ni que decir de la página personalizada de google, que ahora cuenta hasta con manejo de temas "para hacer mas bonita la visita :P".

Que lo disfruten.

Descarga Directa

Seguímos en Línea.

viernes, mayo 18, 2007

TRUCOS PARA WINDOWS XP

Bueno aqui les traigo unos trucos para optimisar sus equipos espero que les sirvan antes de hacer cual quier modificacion les recomiendo hacer un respaldo de sus archivos y de su registro bueno espero que les sirva nos estamos bien en casa de Tadeo el Viernes

Este truco liberara la memoria y el disco para que puedan accesar mas rapido a los programas

Buscamos en el editor del registro la siguiente cadena
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Session Manager/Memory Management
Buscan en el panel derecho la entrada DisablePagingExecutive y hacemos doble clic sobre ella
cambiamos el valor de 0 a 1 y pulsamos aceptar reiniciamos la compu y listo


La tecla del logotipo Windows permite crear accesos directos para los siguientes comandos:

a.. Tecla del logotipo de Windows: Muestra el menú Inicio

b.. Tecla del logotipo de Windows + D: Minimiza o restaura todas las ventanas

c.. Tecla del logotipo de Windows + E: Muestra el Explorador de Windows

d.. Tecla del logotipo de Windows + F: Muestra Buscar archivos

e.. Tecla del logotipo de Windows + Ctrl + F: Muestra Buscar equipo

f.. Tecla del logotipo de Windows + F1: Muestra Centro de ayuda y soporte técnico

g.. Tecla del logotipo de Windows + R: Muestra el cuadro de diálogo Ejecutar

h.. Tecla del logotipo de Windows + Inter Muestra el cuadro de diálogo Propiedades del sistema

i.. Tecla del logotipo de Windows + Mayús + M: Deshace minimizar todas las ventanas

j.. Tecla del logotipo de Windows + L: Bloquea la estación de trabajo

k.. Tecla del logotipo de Windows + U: Abre el Administrador de utilidades

Acelerar la exploración de equipos en red e incrementar el rendimiento general

Desde los tiempos de Windows 2000, existe un bug por el cual al explorar contenidos de ordenadores remotos, el sistema busca además de los archivos compartidos las tareas programadas de la máquina, con lo que podemos experimentar retrasos de hasta 30 segundos cuando intentamos ver los archivos compartidos desde una red Para que sistema no busque las tareas programadas en equipos de red al explorar sus recursos compartidos, iniciaremos la herramienta de edición del sistema, con el comando “regedit.exe” desde el menú Inicio/Ejecutar y localizaremos la clave HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/ Explorer/RemoteComputer/NameSpace/{D6277990…}. En primer lugar, dentro del menú registro, seleccionaremos la opción Exportar rama de forma que podamos restaurar esta característica en caso necesario. Acto seguido borraremos la clave. NOTA: Al eliminar esta clave, eliminaremos la posibilidad de ver y administrar tareas programadas en ordenadores remotos. También relacionado con el rendimiento de las conexiónes a través de red, podemos incrementar el número de búffers que el redirector reservará para el rendimiento de la red, incrementando de esta manera el caudal de datos que podrá administrear. Cada hilo extra que configuremos hará uso de 1k adicional de memoria no paginada, pero únicamente si la aplicación está haciendo uso de ellos. Para configurar el número de búffers e hilos adicionales iniciaremos la herramienta de edición del sistema, con el comando “regedit.exe” desde el menú Inicio/Ejecutar y localizaremos la clave HKEY_LOCAL_MACHINE\System\CurrentControlSet\ Services\LanmanWorkstation\Parameters. Allí crearemos un o modificaremos los valores DWORD "MaxCmds" y "MaxThreads", cuyo contenido deberá ser el mismo en ambos, el valor por defecto es 15 y el rango que podemos especificar va desde 0 hasta 255.

Mejorar ancho de banda del XP Professional

Windows XP se reserva el 20% del ancho de banda disponible, con el fin de ejecutar aplicaciones especiales. La “retención” se produce mediante el denominado el programador de paquetes QoS (Quality of Service – Calidad del Servicio), encargado de la optimización de redes locales.

Sin embargo, para los usuarios privados, que sólo tienen un PC en casa, QoS no es una función necesaria; sino todo lo contrario. Windows XP reserva el 20% del ancho de banda aunque el usuario cancele la función QoS. También se puede optar por desintalar el Programador de paquetes QoS si no tenemos ninguna Red Local.

Resumiendo viene a decir: El QoS (calidad del servicio) es una función bastante comun en Internet, se usa para garantizar que unas transferencias no bloquean a otras. En Windows XP el protocolo reserva un máximo de un 20% del ancho de banda para paquetes de alta prioridad, de forma que estos siempre puedan transmitirse. Esto hace posible que por ejemplo, podamos estar descargando 2 ficheros de dos servidores a la vez, y mientras usar el IRC o el messenger y que los mensajes que enviamos y nos envian lleguen sin retraso. Si no hay paquetes de alta prioridad, ese ancho de banda se usa para transmitir paquetes normales.

1) Entrar como administrador.
2) Inicio, ejecutar, escribid: gpedit.msc
3) Aparecen las directivas de grupo, id a Configuración de Equipo.
4) Plantillas Administrativas
5) Red (Network)
6) Programador de Paquetes Qos
7) Doble click en Limitar el ancho de banda reservado
8) Habilitarlo y poner el 0% en Límite de Ancho de Banda.
9) Aplicar y Aceptar
10) Id a propiedades red y comprobad que está marcado el Programador de Paquetes Qos.

martes, mayo 15, 2007

Manejo de Stored Procedures en Delphi

Continuando con la práctica 1, y resolviendo la peticion de un visitante, primero que nada, un Stored Procedure o Procedimiento Almacenado es un Query o Funcion almacenada en la Base de Datos de nuestra preferencia, en mi caso es MySQL 5.0, donde por medio de parámetros el query ejecutará una serie de acciones las cuales traerán consigo el resultado que queramos.

Existen varias formas de llamar un Stored Procedure (Procedimiento Almacenado) en
Delphi, pero yo usaré la más fácil, con el uso de un ZTQuery. Esto tambien se puede hacer de la misma manera con componentes ADO, pero para este ejemplo usaré las librerías Zeos.

La sintaxis de un Stored en MySQL es la siguiente:

NOTA: El siguiente stored inserta el registro de un cliente en la tabla T_CLIENTES

CREATE PROCEDURE `sp_ClientesInserta`
(
IN `pid_cliente` bigint(11),
IN `pnombre` varchar(100),
IN `prfc` varchar(20),
IN `pdireccion` varchar(100),
IN `pcp` varchar(10),
IN `pciudad` varchar(50)
)
BEGIN
/* Inserta nuevo registro*/
Insert into t_clientes (nombre, rfc, direccion, cp, ciudad) values (pnombre, prfc, pdireccion, pcp, pciudad);
END

Con código rojo destaco el nombre del Procedimiento Almacenado, en verde se muestran cada uno de los parametros y dentro de Begin y End van nuestras sentencias SQL.

Tambien podemos hacerle una modificacion donde se valide primeramente si ya existe el mismo RFC en la tabla antes de insertarlo.

CREATE PROCEDURE `sp_ClientesInserta`
(
IN `pid_cliente` bigint(11),
IN `pnombre` varchar(100),
IN `prfc` varchar(20),
IN `pdireccion` varchar(100),
IN `pcp` varchar(10),
IN `pciudad` varchar(50)
)
BEGIN
/*Valida Existencia de RFC*/
Declare vContador varchar(20);
Select vContador=count(*) From t_clientes Where rfc=prfc;
/* Inserta nuevo registro*/

IF vContador <=0 then
Insert into t_clientes (nombre, rfc, direccion, cp, ciudad) values (pnombre, prfc, pdireccion, pcp, pciudad);
END IF;
END

Ahora con azul contabilizamos los registros que coincidan con el RFC que enviamos de parámetro, si existe alguno no se inserta (con amarillo).

Ya que tenemos nuestro Stored Procedure lo llamamos con la sentencia CALL.

call sp_ClientesInserta(1,'Jesús Feran','XXXXXXXXXXXX','Tecnosis MX', 555555,'SJR');

Ahora lo unico que resta es llamarlo en un ZTQuery desde delphi.

Active:=False;
Connection:=ZConnection1;
Close;
SQL.Clear;
SQL.Add("call sp_ClientesInserta(1,'Jesus Feran','XXXXXXXXXXXXX','Tecnosis MX', 56500,'SJR');");
ExecSQL;
Close;

Y según yo, ya es todo, con eso envian parámetros a un stored desde delphi.

Espero les sirva, nos vemos.

NOTA: Se pueden crear Stored Procedures con el asistente de MySQL Maestro, pero se me hace muy tardado, aun que seguro.

Seguímos en Linea.

sábado, mayo 12, 2007

Instalando lo necesario para ASP.NET

Primero tenemos que instalar el IIS (de preferencia antes que el Framework de .NET y que el lenguaje que vayamos a usar ya que después puede que el IIS no registre algunos componentes y tengamos que hacer pasos extras para que funcionen nuestras páginas en .NET)

-IIS

Para instalar el IIS nos vamos a Panel de Control / Agregar o Quitar Programas y luego en Agregar o quitar componentes de Windows.
Agregamos el que dice Servicios de Internet Information Server (IIS), podemos darle en Detalles y asegurar que se instale el Servicio World Wide Web.

Y ya :P


-Framework .NET
El Framework 1.1 normalmente se instala en alguna actualizacion de Windows XP y ya viene en el Service Pack 2 por defecto, o sea que no hay mucha bronca, pueden checar si lo tienen entrando en Panel de control - Herramientas Administrativas y ahi deben de tener dos accesos directos, uno que diga "Microsoft .NET Framework 1.1 Configuration" y el otro "Microsoft .NET Framework 1.1 Wizards". Si no los tienen descarguense el Framework 1.1 de aqui.

-Lenguaje con soporte para .NET
Pues ya nada más instalan el lenguaje que vayan a usar, en este caso el Delphi 2006, luego les paso el Studio Completo del Borland Delphi 2006, si no mientras lo pueden bajar del E-mule :P jeje.

viernes, mayo 11, 2007

Busqueda Incremental en Delphi

A veces es necesario hacer las llamadas Busquedas Incrementales, las cuales consisten en ir escribiendo en un EDIT y un DBGrid se comience a filtrar con los resultados que coincidan solamente con lo que hemos escrito.

Es decir, tenemos una tabla de la siguiente manera:

ID - Nombre
1 Miguel
2 Martin
3 Jerry
4 Tadeo
5 Jesus

En el edit escribimos JE y en el grid solo nos apareceran:

ID - Nombre
3 Jerry
5 Jesus

Pues ahora filtramos los campos solamente con los que empiecen con JE.

Esto se realiza con un LIKE en SQL que sería así:
Select id, nombre From MiTabla Where nombre LIKE '%JE%'

El codigo queda en el evento OnChange del Edit.

procedure TLaForma.edt_nombreChange(Sender: TObject);
var
vstrCadena: String;
begin

vstrCadena:= 'Select id, nombre from tabla Where nombre LIKE '+char(39)+'%'+edt_nombre.Text+'%'+char(39);

with ZQ_Consulta do
begin
Close;
SQL.Clear;
SQL.Add(vstrCadena);
try
Open;
except
ShowMessage('No se pudo ejecutar la consulta');
end;
end;
end;

Donde mi ZQ_Consulta es un TZQuery. Igual funciona para un TADOQuery normal.

jueves, mayo 10, 2007

ASP .NET



Primero vamos a explicar a groso modo que es .NET, más adelante daremos algunos ejemplos de esta plataforma:

Para empezar hay dos formas de desarrollar aplicaciones .NET, una es en la Web (ASP.NET) y la otra desarrollando aplicaciones de escritorio (si también se puede!!) que ya no se llaman Aplicaciones sino WinForms, aqui es igual son archivos .exe, y es practicamente igual que programar en un visual pero usando librerías de .NET.

(Los ejemplos que pondré después serán solo para ASP.NET porque es el que he estado trabajando, como ya les dije WinForms es casi igual que otro lenguaje visual)

Hay que decir que a pesar que la plataforma se llama ASP.NET (.NET pa' abreviar), no tiene nada que ver con el Lenguaje ASP desarrollado por Microsoft, o sea que no programaremos en ASP, por el contrario vamos a programar en el Lenguaje que tenga soporte para .NET, ya sea VisualBasic, Delphi, C#, etc.

Uno de los propósitos de esta plataforma es estandarizar la programación, porque aunque se programa en diferentes lenguajes, se usan los mismos "uses" o librerías (que aqui ya se llaman namespaces) ya sea para Delphi, VB, C#, etc. Así las diferencias entre la programación en .NET se reduce a la diferencia entre como declarar variables, crear objetos, etc. en cada lenguaje, pero la lógica es la misma.

Que ventajas tiene ASP.NET? pues muchas, primero es un lenguaje orientado totalmente a objetos (y yo que nunca le puse atención a Domingo :(...) la programación es mucho más fácil, es código precompilado, por lo cual es más rápido, todo lo pesado lo hace el servidor :-D.

Para que quede más claro: cuando programas en ASP.NET, se generan principalmente dos archivos por página: el .aspx (la página con código HTML y toda la onda) y el archivo del código programado (.pas para Delphi). Cuando se hace una petición a la página la hacemos a través del .aspx, y cuando se requiere se hace uso del .pas que esta "mezclado" en el aspx, así en realidad programas en Delphi y cada que se ejecute se compila solo esa parte que se requiere haciendo todo más rápido y fácil.

Para poder trabajar con ASP.NET se necesitan principalmente 3 cosas:

1-Una computadora... =S ah chinga jajajaja

no en serio:

1.-El lenguaje que soporte .NET
2.-El Framework de .NET
3.-Un servidor Web

Aquí los que vamos a usar son:

1.- Delphi 2006 (que es el único Delphi con buen soporte para .NET)
2.- El framework 1.1 (el más nuevo es el 3 y el más usado en los ultimos tiempos el 2, pero Delphi sólo es compatible con Framework 1.1)
3.- El IIS (este porque viene por defecto en todos los Windows XP, y en cuanto a características no tiene nada que pedirle a Apache... además este es más fácil de configurar y administrar :P)

En el siguiente post, les pondré como configurar e instalar lo necesario para empezar a programar, saludos.

miércoles, mayo 09, 2007

Zeos Lib Librerías de conexión libres para Delphi

El sistema que estoy haciendo me ha dado una serie de problemas en cuanto a la conexión, aún que ya tengo un programa que me genera mi archivo encriptado de configuración donde guardo los parametros variables del sistema como son: Servidor, Puerto, Nombre de Base de Datos, Usuario, Password y otros, me he visto en la necesidad de modificarlos por mi cambio de librerías...

Me encuentro con la belleza de Zeos Lib (Zlib), que son librerías Open Source para conexiónes de Delphi con MySQL, Postgress, Firebird entre otros. La libreria la puedes descargar desde aqui, y les dejo un tutorial llamado: "Cómo Instalar Zeos Lib y no morir en el intento"(link actualizado el 06 Noviembre del 2009), muy directo y facil de usar... con unos pequeños ejemplos de su uso.

La desventaja según el manual de usar Zlib es que no viene con ayuda sobre los componentes... ni modo, prueba y error (como si fuera nuevo este metodo para nosotros).

Bendito Dios que creo Open Source :-D


Editado:
Al instalar y seguir los pasos del manual me encontre con un problema, donde el archivo ZPlainMysql.inc se encontraba bloqueado al compilar un packeage, nuevamente busque la solucion y encontre la siguiente:

Descargue el archivo ZEOSLIB_TESTING_REV240.zip de ZeosDownloads, al descomprimir el archivo fui a la carpeta SRC y despues a PLAIN, en copie todo el contenido de esta carpeta y lo pase a la carpeta PLAIN pero del primer packeage que descargue (De la version 6.6.1).

Nuevamente repeti los pasos del manual y todo quedo a la perfección.

martes, mayo 08, 2007

Liberación de memoria en Delphi

Hace como 6 meses publique en mi blog el como hacerlo, y aquí esta nuevamente:

http://www.seshop.com/image/product/200411/BOL661750_L.jpg
Normalmente para el manejo de memoria utilizamos el siguientye metodo.

1.- Vamos al menú Project / Options

2.- En la lista de Auto-create forms seleccionamos solamente las formas que se deben crear al iniciar el proyecto. Dejando en la lista Aviable forms las formas que crearemos solo al mandarlas llamar.

3.- Para llamar una forma (crearla) hacemos lo siguiente:

Forma:=TForm.Create(nil); //Creamos la forma
Forma.Show; //Mostramos la forma

4.- Para eliminar la forma de memoria hacemos lo siguiente:

Forma.Free;

5.- El FREE elimina la forma de memoria y todos los componentes, pero no elimina los componentes creados a mano, es decir, aquellos que generamos con TTipoObjeto.Create()

Nuestro problema surgió al ver como la memoria RAM aumentaba y nunca disminuía (lo hacia al menos un poco, pero no lo suficiente). Creacia de 13 Mb ocupados en memoria hasta 200 Mb en el transcurso del uso del sistema hasta trabar la computadora.

Par solucionar el problema debíamos buscar una solucion la cual no nos quitara tiempo al cambiar todo el código y el modo de crear los objetos. Así que juntos encontramos la siguiente solución, que a muchos les será de utilidad.

Eliminación de memoria virtual en Delphi que no se encuentra en uso.

Para hacer lo siguiente basta con ejecutar el siguiente procedimiento:

procedure FreeRAMDelphi;
begin
if Win32Platform = VER_PLATFORM_WIN32_NT then
SetProcessWorkingSetSize(GetCurrentProcess, $FFFFFFFF, $FFFFFFFF);
end;

Y la mandamos llamar de la siguiente manera:

try
Forma:=TForm.Create(nil);
Forma.Show;
finally
FreeRAMDelphi;
end;

Fuente: lawebdejm.com

Extracto de bibliografia utilizada:
Región 1

Familia 95: de $00000000 a $003FFFFF
Familia NT: de $00000000 a $00000FFF

Región privada para permitir la compatibilidad con aplicaciones de MS-DOS. En MS-DOS no era posible escribir dentro de los primeros 4Kb de memoria, así que cuando diseñaron Windows tuvieron que continuar con la misma limitación. Un intento de lectura/escritura sobre las primeros 4 Kb (desde $0000 a $FFFF) provocará una violación de acceso. Esa región también es privada para detectar la utilización de punteros nulos, ya que intentarían escribir en la dirección 0.


Región 2

Familia 95: de $00400000 a $7FFFFFFF
Familia NT: de $00001000 a $7FFEFFFF

En esta región es donde se almacenan los datos privados de cada proceso. Como podemos ver, la cantidad de memoria que puede llegar a utilizar una aplicación no son 4 GB como dijimos en principio, sino que son aproximadamente 2 GB.
En la familia NT se almacenan tanto el código y datos de los ejecutables como las DLL del sistema y de usuario. Cualquier variable que utilicemos desde nuestros programas estará en este rango.


Región 3

Familia 95: de $80000000 a $FFFFFFFF
Familia NT: de $8000000 a $FFFFFFFF

Región privada donde se carga el kernel del sistema operativo y los controladores de dispositivos (archivos .VXD).
En Windows 95 además, esta región alberga las DLLs y los archivos proyectados en memoria. Otra diferencia entre Win95 y NT es que para el primero, la región es accesible por el proceso, y el segundo provocará una violación de acceso si se intenta leer/escribir en este rango de direcciones.
Seguímos en línea.

lunes, mayo 07, 2007

Conocer el Path de nuestro programa en Delphi RunTime

La siguiente función retorna una cadena de caracteres:

ExtractFilePath(Application.ExeName);

Fácil.

Seguímos en Línea.

jueves, mayo 03, 2007

Practica Tecnosis - Sistema de Base de Datos

Bien, el objetivo de este blog es que todos aprendamos, es por eso que aqui va mi primer práctica donde aprenderemos a dar de alta registros en una base de datos MySQL 5.0 desde Delphi, con herramientas DevExpress y manejo de Stored Procedures. Se me ocurrio postear esto pues actualmente hago un sistemilla con estas herramientas.

Si no saben que son los Stored Procedures (Procedimientos Almacenados) no se preocupen, poco a poco les iré explicando, pero antes que todo inicie necesitamos instalar las herramientas a usar.

  1. Primero Instalen Delphi, yo uso el 2005.
  2. Ahora instalen MySQL 5.0 o superior, para que todo salga bien y no pierdan mucho tiempo (La salida fácil), instalen la última versión de AppServNetwork el cual tambien incluye PHP y Apache, el solito levanta el servidor, ya que lo instalen se dirigen a su navegador y escriben http://localhost ó http://127.0.0.1 y les mostrará la página de su servidor web local (el de su computadora).
  3. Ahora instalense MySQL Maestro v7.2.0.3 15.4M Completo 3.86M el cual nos permite Administrar fácilmente bases de datos MySQL desde esta interfaz, para manejar los storeds, vistas, triggers, etc etc. [Capturas de pantalla]
  4. Ahora solo queda instalarse los componentes de DevExpress y listo.
Háganlo y cuando terminen avisan, para ir con la siguiente lección.
Nota: Con estas herramientas pretendo dar más ejemplos, así que se las recomiendo mucho.
Seguímos en Linea.

DevExpress para Delphi y soporte .NET

En mi trabajo pasado usamos estos componentes, los cuales trabajan de maravilla ayudandonos a reducir en gran parte el codigo y dandole una muy buena presentación a nuestro trabajo..

Encontre todos los componentes en un blog llamado GSLab de Wordpress, no se cuanto tiempo sigan en linea los links, así que será mejor que lo visiten ya.

Seguímos en Línea.

miércoles, mayo 02, 2007

NetSupport

Exelente utilidad para el control de Redes, puedes ver y controlar el acceso a los equipos de tu red. Puedes tomar el control parcial o total de un equipo, enviar mensajes a equipos y muchas cosas mas.

Paginación en SQL con LIMIT

En MySQL
La cláusula LIMIT es usada para limitar el número de registros devueltos en una sentencia SQL. Así que si tienes 1000 filas en una tabla pero sólo te interesa obtener los 10 primeros, puedes ejecutar una sentencia como esta:
SELECT columna FROM tabla LIMIT 10
Esto es similar a la clásula TOP de Microsoft SQL Server, sin embargo, en MySQL el LIMIT siempre va al final de la sentencia SQL.

Ahora, suponiendo que te interesa mostrar los registros 11-20, con el uso de la palabra clave OFFSET esto es realmente muy fácil. La consulta quedaría entonces así:
SELECT columna FROM tutabla LIMIT 10 OFFSET 10
Esta característica hace que sea muy fácil programar la paginación de resultados haciendo que los valores para el LIMIT y el OFFSET sean variables.

Bueno, es todo, espero que sea de utilidad el tip.

lunes, abril 30, 2007

Linksys WVC54GC Hacer Streaming Video


Ahora me he topado con un problema, es el siguiente:

Después de trabajar con las cámaras que da Telmex para vigilancia Linksys WVC54GC, al incluirlas en un sitio web, existe el problema de que para poder verlas, solamente se puede realizar con Internet Explorer, ya que se necesita la instalación de un ActiveX de Linksys para poder observar el video... y otro problema es que la interfaz obligada a usar es la de la misma cámara de video...

Todo esto limita a usar un solo navegador de internet y decirle adiós a mi querido Mozilla Firefox, ya que Firefox no permite la instalación de ActiveX por la inseguridad que estos (en algunos sitios) puede traer.

Así que me vi a la tarea de resolverlo de la siguiente manera:

Primero que nada el video en Streaming es capturado desde la cámara en la dirección http://IP_DE_LA_CAMARA/img/video.asf, y para poder ver el video ASF lo podemos hacer desde el mismo Windows Media Player... AQUI ESTA LA SOLUCIÓN, solo incluimos en nuestro código HTML un objeto de Windows Media Player que lea esa dirección y LISTO!.

Cabe mencionar que aún no logro hacer el video igual de fluido que con Internet explorer y su ActiveX, pero de que se ve, se ve...

El codigo es el siguiente:

<OBJECT ID="MMPlayer1" WIDTH=350 HEIGHT=300

classid="CLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95"

CODEBASE="http://activex.microsoft.com/activex/controls/

mplayer/en/nsmp2inf.cab#Version=5,

1,52,701" standby="Loading Microsoft Windows Media Player components..."

type="application/x-oleobject">

<PARAM NAME="FileName" VALUE="http://IP_DE_LA_CAMARA/img/video.asf">

<PARAM NAME="ShowControls" VALUE="1">

<PARAM NAME="ShowStatusBar" VALUE="1">

<PARAM NAME="DefaultFrame" VALUE="1">

<PARAM NAME="Autostart" VALUE="1">

<param name="Rate" value="1000">

</OBJECT>

Solo es cuestion de ponerlo en el BODY del Codigo y listo.

Seguímos en Línea.

sábado, abril 28, 2007

Creación de un Disco Desatendido de Windows XP

Bueno, en primera ¿Que es eso de Desatendido?... simplemente que al instalar tu disco de Windows en tu computadora no te pida NADA... que se instale solo sin preguntarte ni madres... por que ah! como cae gordo que te pregunte hasta de tu fé de bautizo cada que lo instalas...

Lo que les explicaré es es modo más básico de hacerlo... aún que tambien hay herramientas que lo hacen por ti y son más amplias, pero no deja de ser un buen truco.

Primero introduce el Cd de Windows Xp y ejecuta el Archivo setupmgr.exe que se encuentran en el archivo deploy.cab en el directorio \support\tools , clic en siguiente y elegimos la opción "Crear archivo de respuesta" luego "Crear Instalación Desatendida" Después nos preguntará que tipo de Windows XP Usamos (si Windows XP Proffesional, Home Edition) volvemos a pulsar siguiente y seleccionamos "Totalmente Automatizado" al final decimos que es un archivo de respuesta para la instalación y aceptamos esta licencia. Solo resta completar los campos con clave y nombre de equip. y le decimos que lo guarde en A: (o en la unidad de disquete si no es A:) se crean dos archivos (unattend.txt y unattend.bat) ejecuta el unattend.bat para iniciar la instalación.
Hay varias cosas que se pueden hacer para mejorar nuestra instalación:
En la zona de [DATA] del archivo de respuestas podemos modificar o agregar esto:
Autopartition=1 nos preguntará por el espacio de las particiones. Si lo ponemos en 0 utilizara todo el espacio disponible en el disco para una partición.
• En la zona de [Unattended]:
Repartition="NO" nos preguntara por el tipo de sistema de archivos ( TFS, FAT ). Si lo usamos en modo automático (YES) no podemos elegir el sistema de archivos FAT, sólo el NTFS.
WaitForReboot="NO" eliminara las pantalla que esperan 15 segundos para hacer el reinicio, y ya quedo...

Seguimos en Linea, Jesus Feran

jueves, abril 26, 2007

Seguridad en PHP

Como mi primer aporte les intentaré explicar como es que le podemos poner (sin albur) seguridad o restricciónes a una página web usando PHP. Esta guía la encontré en webestilo.com, pero voy aplicarla para restringir el acceso a los album de fotos de guardepequitas.com y veamos a ver que sucede.

Primero que nada el acceso restringido a páginas usando las variables globales $PHP_AUTH_USER, $PHP_AUTH_PW y $PHP_AUTH_TYPE solo funciona si PHP ha sido instalado como un módulo de Apache, si ha sido instalado como un CGI los ejemplos de ésta sección no funcionarán.

Para evitarno este show pueden instalarse el Apache+PHP+MySQL juntos y sin problemas con el appservnetwork

Para conseguir la autentificación en las páginas usaremos el sistema de autentificación del protocolo HTTP, este sistema se basa en las variables globales $PHP_AUTH_USER y $PHP_AUTH_PW.
  • $PHP_AUTH_USER. Nombre de usuario introducido.
  • $PHP_AUTH_PW. Contraseña introducida.
Para que el navegador nos muestre la ventana de petición de nombre de usuario y contraseña basta con enviar la siguiente cabecera:

**** Este fragmento de código lo incluirémos en cada una de nuestra páginas, pudiendo así llamar a la ventana de autentificación cada que entremos y si no se escribe usuario: tecnosis y password HuevoS simplemente nos enviará el código en verde, provocando con esto un exit haciendo que no se muestre todo lo que sigue ****

<?php

if (($PHP_AUTH_USER!="Joe") || ($PHP_AUTH_PW!="123")) {

header('WWW-Authenticate: Basic realm="Acceso restringido"');
header('HTTP/1.0 401 Unauthorized');
echo 'Authorization Required.';
exit;


}

?>




<html>

<head>


<title>Ejemplo de PHP</title>

</head>

<body>


Ha conseguido el acceso a la <B>zona restringida</B>.

</body>

</html>



Este es un ejemplo básico para la restricción de un página, espero les sirva algún día.

Seguimos en Línea. Jesus Feran

Inicio

Muy bien, como he aprendido solo compartiendo conocimientos podremos avanzar. Este es un blog exclusivo para los tecnosis y sus amigos, es por eso que abiertamente les digo HUEVOS A TODOS.

El obetivo de dicho blog es ir publicando cada uno algún tip, codigo, diseño o cualquier cosa que sepamos que a los demás nos puede servir.

Este será un GRAN blog, SIENTANSE libres de opinar y publicar... =)

Así que comencemos.