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

sábado, 19 de mayo de 2012

Wordpress: Custom Post Type y Auto guardado/Autosave

El siguiente post es debido a un pequeño problema al crear un Custom Post Type o Custom Meta Box, que cuando creamos un post, noticia y otro, los campos se borran solos cuando salimos del formulario o cuando se realiza el autosave de wordpress.

Un ejemplo de un Custom Post Type en nuestro functions.php :

add_action('init', 'texto');
function texto() {

    $labels = array(
        'name' => _x('texto', 'post type general name'),
        'singular_name' => _x('texto', 'post type singular name'),
        'add_new' => _x('Agregar Nuevo', 'texto'),
        'add_new_item' => __('Agregar Nuevo texto'),
        'edit_item' => __('Editar texto'),
        'new_item' => __('Nuevo texto'),
        'view_item' => __('Ver texto'),
        'search_items' => __('Buscar texto'),
        'not_found' =>  __('Nada encontrado'),
        'not_found_in_trash' => __('Nada encontrado en papelera'),
        'parent_item_colon' => ''
    );

    $args = array(
        'labels' => $labels,
        'public' => true,
        'publicly_queryable' => true,
        'show_ui' => true,
        'query_var' => true,
        'rewrite' => true,
        'capability_type' => 'post',
        'hierarchical' => true,
        'menu_position' => null,
        'rewrite'   => true,
        'has_archive' => true,
        'supports' => array('title','editor', 'excerpt','thumbnail','comments','author','page-attributes')
    );

    register_post_type( 'texto' , $args );
}


function admin_init(){
    add_meta_box("opcion", "Opcion", "opcion", "texto", "normal", "low");
}


function opcion(){
    global $post;
    $custom = get_post_custom($post->ID);
    $texto= $custom["texto"][0];
    ?>
    Texto: < input name="texto" type="text" id="texto" value="texto; ?>" />

}


add_action('save_post', 'save_opcion');

function save_opcion(){
    if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE )
        return $post_id;

    global $post;
 
    update_post_meta($post->ID, "opcion", $_POST["texto"]);
}

Basta con incluir las siguiente 2 lineas en nuestro código:


    if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE )
        return $post_id;


Estas se ejecutan cuando oprimimos el botón de publicar o cuando se realiza el autosave de wordpress.

jueves, 6 de enero de 2011

Oficial: Drupal 7 Liberado

Despues de 3 años de trabajo en la Versión 7 de Drupal, finalmente ha sido liberada. Podemos descargar Drupal 7 desde su sitio oficial.

Requerimientos de Drupal 7:
  • Un servidor web: Apache (recomendado), Nginx, Lighttpd, o Microsoft IIS
  • Base de datos: MySQL 5.0.15 o superior, PostgreSQL 8.3 o superior, o SQLite 3.x
  • PHP: 5.2.4 y superior
  • Memoria: 32MB (Un sitio con varios de los módulos más comúnmente habilitados puede requerir 64MB o más.)
Entre sus principales funcionalidades:


- Contenido flexible: Puede definir campos personalizados que podrán ser utilizados en tipos de contenido, usuarios, comentarios, términos y otras entidades. Almacene los datos de esos campos en SQL, NoSQL o utilice almacenamiento remoto.

- Mejor diseño de plantillas: Controle exactamente qué se muestra en pantalla con la nueva Render API y algunos hooks drásticos para modificaciones. El nuevo módulo RDF provee marcado semántico para la web.

- Accessible: Las pantallas de administración son ahora mucho más accesibles. Las abundantes mejoras en el interfaz le facilitan la construcción de páginas web altamente accesibles.

- Imágenes y ficheros: El soporte de ímagenes en el contenido está ahora incorporado en el núcleo. Genere versiones diferentes para thumbnails, vistas previas y otros estilos de imágenes. Ahora es posible utilizar las gestiones privada y pública de ficheros al mismo tiempo.

- Testing automático del código: Un nuevo entorno de testing automatizado, con más de 30.000 tests incluidos permite el testing de integración continua de todos los parches al núcleo de Drupal y a los módulos contribuidos.

- Soporte de base de datos mejorado: Una nueva capa de abstracción de base de datos provee soporte para SQLite, MySQL/MariaDB y PostgreSQL out-of-the-box. Puede instalar módulos contribuidos para utilizar MS SQL Server, Oracle, y más.

- Mejor soporte para distribuciones: Utilice perfiles de instalación para distribuir su producto personalizado basado en Drupal. Una nueva API y configuración exportable le permite capturar más opciónes en código.

- Extender: Gracias a un enorme esfuerzo de la comunidad, más de 800 módulos están disponibles o bajo desarrollo activo para Drupal 7, incluyendo Views, Pathauto, y WYSIWYG, con muchos otros en el camino de actualizarse cada día.



martes, 2 de noviembre de 2010

Limitar ancho de banda utilizando Apache con Debian "Lenny"

Limitar el ancho de banda es algo que puede parecer poco útil; si contamos con un ancho de banda suficiente como para satisfacer todas las peticiones realizadas a nuestro Servidor Web; el cuál puede incluir descarga de archivos, videos, entre otros.

A continuación veremos como limitar el ancho de banda de nuestro Servidor Web utilizando Apache en Debian "Lenny". Partiremos de que ya tenemos instalado apache2.

Paso 1: Instalar módulo "libapache2-mod-bw"

Instalaremos el módulo que necesitamos mediante el comando aptitude y buscamos el módulo libapache2-mod-bw.

También utilizando el comando apt-get install libapache2-mod-bw


Paso 2: Activar módulo en Apache

Para activar el módulo debemos teclear el comando a2enmod bw, esto permite que se active en apache el módulo que hemos instalado.


Paso 3: Reiniciar el servicio Apache

Para reiniciar este servicio tecleamos /etc/init.d/apache2 restart


Paso 3: Configurar Virtual Host en Apache

Para configurar un Virtual Host en apache vamos ir al directorio:

/etc/apache2/sites-available/default

Dentro de VirtualHost y Directory

Le agregamos las líneas que a continuación listamos (mantenemos las que se encuentran en este archivo):

#Activar el límite de ancho de banda.
BandwidthModule On

# Forzamos a que se limite en cada petición.
ForceBandWidthModule On

# Limitamos el ancho de banda a 10kb/s
Bandwidth all 10240

Paso 4: Reiniciar Apache

Para reiniciar nuestro Servidor Web debemos teclear el siguiente comando en la consola:

/etc/init.d/apache2 restart


Dejanos tus comentarios y cuentanos tus experiencias. Que mejoras le haz añadido a tu configuración. Esperamos que nuestro artículo les sea de gran utilidad.

sábado, 23 de octubre de 2010

Rediseño en Drupal

Hace pocos días Drupal.org publicó el nuevo diseño de su sitio, después de anunciar la versión beta 1 de Drupal 7 en Agosto del 2010. Este diseño estaba disponible en su versión beta, para la comunidad de usuarios.



Para los usuarios que utilizabamos el diseño anterior de Drupal.org, observamos en este cambio, que no incluye los anuncios en su página principal. El nuevo diseño está basado en las prioridades de los usuarios en los resultados de la encuesta de Drupal en el 2007.

Actualmente se encuentra publicada la versión beta 2 de Drupal 7 la cuál incluye una lista de mejoras realizadas desde Drupal 6, se espera que esta sea la última, todo depende de las pruebas que se realicen y los errores encontrados por la comunidad.

sábado, 16 de octubre de 2010

Vota por Drupal en el "2010 Open Source Awards"

Desde el sitio oficial de Drupal.org (Mejor CMS en el año 2009) nos informan que ya esta disponible el sistema de votaciones para los premios "2010 Open Source Awards", donde se premiarán en un evento en línea que se realiza anualmente a los mejores CMS de este año 2010, organizado por Open Source Awards, donde Drupal es premiado desde hace 5 años.


El ganador recibira un premio en efectivo de $2,500, con el motivo de seguir brindando soporte a su CMS (en español: Sistema de Gestión de Contenidos, en inglés: Content Management System). Esta es una manera que tenemos la comunidad de Drupal de ayudar con su proyecto.

Los votos están abiertos solo hasta el 5 de Noviembre de 2010.

Puedes votar por el mejor CMS aquí, solo necesitas introducir tu Nombre, E-mail, y seleccionar el CMS de tu preferencia English (Joomla, Wordpress, Drupal) , Español (Joomla, Wordpress o Drupal).

Drupal se encuentra actualmente en la versión 6.1.9 y esperamos contar pronto con la versión 7 que actualmente esta disponible su beta 1. Puedes conocer mas de Drupal en los siguientes enlaces:
Vota por Drupal !!!

jueves, 7 de mayo de 2009

HTAccess: URL Amigables.

En el articulo anterior comentabamos sobre un script PHP para Crear URL amigables para crear url amigables a partir por ejemplo del título de una noticia. Esta conversión semántica, por ejemplo del título, puede ser usada como enlace y ayuda a los buscadores a indexar de una forma mas eficiente nuestros artículos.

Se debe tener en cuanta que Apache debe tener instalado el modulo "Rewrite":

LoadModule rewrite_module modules/mod_rewrite.so

Aquí mostramos un ejemplo de como realizar redirecciones tambien crear URL amigables o URL semánticas. Este código se incluye en el archivo (.htaccess):

Options FollowSymLinks

RewriteEngine On
RewriteBase /

Con esto hacemos que si da un error como pagina no encontrada (404), realizará una redirección hacia nuestra URL (http://localhost):

ErrorDocument 404 http://localhost
ErrorDocument 500 http://localhost
ErrorDocument 403 http://localhost
ErrorDocument 401 http://localhost

Anteriormente comentabamos sobre utilizar el titulo de una noticia de forma semántica, de esta manera obtenemos el nombre de la url y mediante PHP obtenemos la Noticia o Post a mostrar, por ejemplo seria (http://localhost/news/esto-es-una-prueba/), donde la via para obtener el segundo segmento de la URL mediante $2:

RewriteRule ^(news)/(.*)/$ /news.php?title=$2 [L,NC,QSA]

Tambien podemos definir otras url de forma semantica, por ejemplo:

RewriteRule ^(contactos)/$ /noticias.php [L,NC,QSA]

RewriteCond %{HTTP_HOST} !^localhost$ [NC]
RewriteRule ^(.*)$ http://localhost/$1 [R=301,L]

martes, 5 de mayo de 2009

PHP: Crear URL amigables

El siguiente script PHP nos permite crear nuestras url amigables. Estas url amigables pueden partir del título de un artículo.

Si escojemos como título: "PHP: Crear URL amigables", la url amigable creada sería "php-crear-url-amigables".

A continación ponemos a su disposición la siguiente clase que se encarga de convertir espacios, mayusculas, caracteres a una url amigable.

<?php

function text2url($string) {
$spacer = "-";
$string = trim($string);
$string = strtolower($string);
$string = strtr($string, "áéíóúñÁÉÍÓÚÑ", "aeiounaeioun");
$string = trim(ereg_replace("[^ A-Za-z0-9_]", " ", $string));
$string = ereg_replace("[ tnr]+", "-", $string);
$string = str_replace(" ", $spacer, $string);
$string = ereg_replace("[ -]+", "-", $string);

return $string;
}

// Para mostrar sería de la siguiente manera:

echo text2url("PHP: Crear URL amigables");

?>

Esperamos les sea de interés y ayuda.

viernes, 1 de mayo de 2009

Disponible: Zend Framework 1.8.0

El equipo de Desarrollo Zend Framework liberó la esperada versión 1.8.0. Esta versión destaca uno de los lanzamientos más importantes, ya que incorpora en su lista a tres nuevos componentes:

  • Zend_Tool: es una utilidad de linea de comandos que nos permite auto-generar y mantener nuestra estructura del proyecto.
  • Zend_Application: nos permite centralizar toda la inicialización del bootstrap en una sola clase, es decir encapsulará toda la lógica de arranque de nuestro sistema, permitiendo un index.php mucho más limpio y delegar todos los procesos en la clase Bootstrap que implementa distintos método para inicializar los distintos componentes del sistema (Db, Layout, View, Logger, Config, Front Controller, Control de Errores, Config del ambiente, Locale, etc… ) y finalmente incorporar un método main() que centralice todo y sea la puerta de entrada a nuestro sistema.
  • Zend_Navigation: una utilidad para generar tus menús, sitemaps, bradcrumbs, etc.

Además trae todo tipo de validaciones y filtros listos para usar y otras mejoras a componentes como Zend_Pdf, etc.

Descargar ZF

lunes, 13 de abril de 2009

PHP: Enviar email mediante SMTP con Autentificacion usando librerias de Zend Framework

El desarrollo de aplicaciones que permitan el envio de email hacia determinado servidor es muy comun para las diferentes aplicaciones. Bien pueden ser usadas para el envio de boletines electrónicos, logs del sistema, notificaciones y mensajes a usuarios.

Para mayor seguridad de nuestro servidor de correo en la mayoria de los casos es activada la opcion de requerir autentificación. Lo anterior es un problema si intentamos enviar mensajes de correo electrónico por la común opcion de mail() en php.

A continuación les muestro un ejemplo utilizando las librarias del Zend Framework. Una de las ventajas de este framework es que podemos utilizar sus clases independientes sin tener que hacer uso completamente del framework y de toda su estructura MVC que es muy util por cierto, pero para aquellos que aun no se adaptan, aqui el ejemplo :

Primeramente cree una clase : sendemail.php

include("Zend/Mail.php");
include("Zend/Mail/Transport/Smtp.php");

class sendEmail{

private $addTo;

/**
* Nombre de destino
*
* @var string
*/
private $nameTo;

/**
* Titulo del email
*
* @var string
*/
private $subject;

/**
* Cuerpo del mensaje
*
* @var string
*/
private $body;

/**
* Enviar email
*
* @param string $addTo
* @param string $nameTo
* @param string $subject
* @param string $body
*/
public function sendDetails($addTo, $nameTo, $subject, $body){

$config = array('auth' => 'login',
'username' => 'USUARIO',
'password' => 'CLAVE');

$transport = new Zend_Mail_Transport_Smtp('HOST', $config);

$mail = new Zend_Mail();
$mail->setBodyText($body);
$mail->setFrom('EMAIL-DE', 'NOMBRE');
$mail->addTo($addTo, $nameTo);
$mail->setSubject($subject);
$mail->send($transport);

}
}
?>

Se debe editar previamente nuestro:
HOST: nombre del servidor SMTP
USUARIO: Nombre del usuario para conectar al servidor SMTP
CLAVE: Clave del usuario para conectar al servidor SMTP
NOMBRE: Nombre que aparecera en el correo
EMAIL-DE: Email que aparecera al usuario, de donde proviene el correo.

La usamos de la siguiente forma index.php

include("sendemail.php");

$email = new sendEmail();
$email->sendDetails($addTo, $nameTo, $subject, $body);
?>

Donde:
$addTo: Email del destinarario.
$nameTo: Nombre del destinatario
$subject: Asunto del mensaje
$body: Cuerpo del mensaje.

Espero les sea de gran utilidad.

miércoles, 8 de abril de 2009

J2ME: Java 2 Micro Edition

En el mundo de la programación existen una gran variedad de lenguajes que nos permiten desarrollar aplicaciones para los ordenadores y dispositivos. En este post veremos una descripción de J2ME.

J2ME es el acrónimo de Java 2 Micro Edition. J2ME es la versión de Java orientada a los dispositivos móviles. J2ME es una versión reducida de JAVA, fue diseñado por Sun en el año 1999 para dispositivos que cuentan con una potencia de cálculo baja e interfaces de usuario pobres. Estos utilizan una máquina virtual más pequeña desarrollada por Sun denominada "KVM" proviene de Kilobyte (haciendo referencia a la baja ocupación de memoria, entre 40Kb y 80Kb).

Los dispositivos móviles cuentan con dos diferentes tipos de configuraciones:
  • Connected Limited Device Configuration (CLDC).
  • Connected Device Configuration (CDC).

Para el desarrollo de aplicaciones para moviles se crearán MIDlet, el cual es un programa capaz de correr en un dispositivo móvil. En J2ME se no existen los tipos float y double.

Quizas te preguntaras que tipo de aplicaciones podemos hacer ? Pues con J2ME se pueden desarrollar todo tipo de aplicaciones, podemos crear nuestras propias aplicaciones para el envio de sms, juegos, y muchisimo mas.

IDE's de desarrollo ? Te recomiendo utilices Netbeans consume recursos pero es una buena opcion, tambien puedes visitar el sitio de Sun que tambien posee un IDE.

Mas adelante, veremos un ejemplo de una aplicacion CDLC acrónimo de "Configuración de dispositivos limitados con conexión", enfocada a dispositivos dotados de conexión y con restricciones de procesamiento y memoria, limitaciones en cuanto a capacidad gráfica. Un ejemplo de éstos dispositivos son: teléfonos móviles, buscapersonas (pagers), PDAs, organizadores personales, etc.

Algunas de éstas restricciones vienen dadas por el uso de la KVM, necesaria al trabajar con la CLDC debido a su pequeño tamaño.

Los CDC acrónimo de Configuración de dispositivos con conexión, están enfocados a dispositivos con más recursos. La CDC está orientada a dispositivos con cierta capacidad computacional y de
memoria. Por ejemplo, decodificadores de televisión digital, televisores con internet, algunos electrodomésticos y sistemas de navegación en automóviles. CDC usa una Máquina Virtual Java similar en sus características a una de J2SE, pero con limitaciones en el apartado gráfico y de memoria del dispositivo. Ésta Máquina Virtual es la que hemos visto como CVM (Compact Virtual Machine).

Aquí veremos un pequeño ejemplo de una aplicación J2ME:

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class HolaMundo extends MIDlet{

private Display pantalla;
private Form formulario = null;

public HolaMundo(){
/* Éste es el constructor de clase. Aquí debemos
inicializar nuestras variables.
*/

pantalla = Display.getDisplay(this);
formulario = new Form(“Hola Mundo”);
}

public void startApp(){
/* Aquí incluiremos el código que queremos que el
MIDlet ejecute cuándo se active.
*/
pantalla.setCurrent(formulario);
}

public void pauseApp(){
/* Aquí incluiremos el código que queremos que el
MIDlet ejecute cuándo entre en el estado de pausa
(Opcional)
*/
}

public void destroyApp(boolean unconditional){
/* Aquí incluiremos el código que queremos que el
MIDlet ejecute cuándo sea destruido. Normalmente
aquí se liberaran los recursos ocupados por el
MIDlet como memoria, etc. (Opcional)
*/
pantalla = null;
formulario = null;
notifyDestroyed();
}
}

Al realizar tu aplicacion puedes compilarla, dentro de tu proyecto se creara una carpeta llamada "dist", donde se encontraran los archivos *.jar y *.jad que debes subir a tu movil.

Que lo disfruten !!!

jueves, 20 de noviembre de 2008

Zend Framework + Ext JS

Hace unos dias llevo trabajando en un proyecto personal que me ha mantenido motivado. En este caso me refiero al uso del Zend Framwork y el Framework Ext JS.

Aqui les dejo una muestra del proyecto. Pues si, es una aplicacion web con un ambiente "Desktop".

El proyecto en si, consistira en crear una gama de diversos servicios, enfocados principalmente para usuarios que posean una intranet empresarial y todo aquel que deseen una aplicacion web al estilo Desktop con los servicios:
- Reportes de problemas.
- Calendario.
- Tareas programadas.
Entre otros servicios que se iran generando al terminar cada una de las etapas y modulos del sistema.

Espero un pronto poder compartir una version final con todos los usuarios que deseen obtenerlo.

Cuentanos que servicios te gustaría encontrar, y como te ha motivado nuestro proyecto ?

Ayudanos a mantener nuestro proyecto accediendo a la publicidad de nuestro sitio :)

lunes, 17 de noviembre de 2008

Zend Framework 1.7.0 Disponible !!!

Para los seguidores nuevos y no tan nuevos, asi como para aquellos que quieran iniciarse en Zend Framework.
Ya se encuentra disponible la version 1.7 para descargar, el cual posee muchas mejoras, entre ellas:
  • Zend_Amf with support for AMF0 and AMF3 protocols
  • Dojo Toolkit 1.2.1
  • Support for dijit editor available in the Dojo Toolkit
  • Zend_Service_Twitter
  • ZendX_JQuery in extras library
  • Metadata API in Zend_Cache
  • Google book search API in Zend_Gdata
  • Preliminary support for GData Protocol v2 in Zend_Gdata
  • Support for skip data processing in Zend_Search_Lucene
  • Support for Open Office XML documents in Zend_Search_Lucene indexer
  • Performance enhancements in Zend_Loader, Zend_Controller, and server components
  • Zend_Mail_Storage_Writable_Maildir enhancements for mail delivery
  • Zend_Tool in incubator
  • Zend_Text_Table for formatting table using characters
  • Zend_ProgressBar
  • Zend_Config_Writer
  • ZendX_Console_Unix_Process in the extras library
  • Zend_Db_Table_Select support for Zend_Paginator
  • Global parameters for routes
  • Using Chain-Routes for Hostname-Routes via Zend_Config
  • I18N improvements
    • Application wide locale for all classes
    • Data retrieving methods are now static
    • Additional cache handling methods in all I18N classes
    • Zend_Translate API simplified
  • File transfer enhancements
    • Support for file elements in subforms
    • Support for multifile elements
    • Support for MAX_FILES_SIZE in form
    • Support for breaking validation chain
    • Support for translation of failure ,messages
    • New IsCompressed, IsImage, ExcludeMimeType, ExcludeExtension validators
    • Support for FileInfo extension in MimeType validator
  • Zend_Db_Table_Select adapater for Zend_Paginator
  • Support for custom adapters in Zend_Paginator
  • More flexible handling of complex types in Zend_Soap
http://devzone.zend.com/article/4045-Zend-Framework-1.7.0-is-now-available

lunes, 31 de marzo de 2008

Java: Estructura de Datos. Grafos.

Desarrollar la Clase Grafo con representación de matriz de adyacencia.

Un grafo consiste de un conjunto de nodos o vértices y un conjunto de ejes o aristas. Usualmente se lo denota = (). Las aristas son pares de vértices () con 2. Si () 2, se dice que y están conectados o son adyacentes. Un trazado o dibujo de un grafo = () usando segmentos de 1 recta para las aristas es una asignación de una posición en el plano a cada vértice en V. En las versiones más simples, los vértices son dibujados como puntos y las aristas como segmentos entre vértices. De aquí en más supondremos que el trazado usa segmentos para las aristas, excepto cuando se aclare lo contrario. También se supondrá que el grafo es conexo, ya que si el grafo a trazar no lo es, se puede trazar cada componente conexa por separado.

Los grafos sólo contienen información relacional entre los vértices, así que en principio no tienen ninguna forma \natural" de ser dibujados. Sin embargo, de las infinitas formas de trazar un grafo en el plano, algunas son claramente peores que otras, siempre teniendo en cuenta que el objetivo es visualizar el grafo.

package grafos;

/**
* Camino Minimo
*
* Calcula el camino minimo
*
* Clase Grafo
*
* @author Damian Adriel Perez Valdes
*
* Un grafo se compone de un conjunto de nodos que están enlazados por
* un conjunto de arcos.
* Cada arco tiene asociado un peso que puede verse como el coste de ir
* del nodo "origen" al nodo "destino"
* Un grafo queda caracterizado, por tanto, por:
* - el número de nodos que tiene
* - los arcos, que representan distancias entre los nodos
*/

public class Grafo {
/**
* Ds nodos sin un arco entre ellos, se dicen que están a distancia INFINITO.
*/
public static final int INFINITO = Integer.MAX_VALUE;

/**
* Número de nodos del grafo.
*/
public int numNodos;

/**
* Tabla con los arcos que enlazan los nodos del grafo.
* Un valor INFINITO indica que no hay conexión entre los nodos.
*/
public int[][] arcos;

/**
* Tablas con la posición (x, y) del nodo en un dibujo.
*/
public int[] posicionX;
public int[] posicionY;

/**
* Construye un grafo con el número de nodos que se pasa como argumento.
*
* @param numero Número de nodos del grafo.
*/
public Grafo(int numero) {
this.numNodos = numero;
arcos = new int[numNodos][numNodos];
posicionX = new int[numNodos];
posicionY = new int[numNodos];
for (int i = 0; i < j =" 0;" i ="=">Representación de dos algoritmos voraces (greedy) sobre la clase Grafo.

El algoritmo de Prim es un algoritmo de la teoría de los grafos para encontrar un árbol de expansión mínimo en un grafo conexo, no dirigido y cuyas aristas están etiquetadas.
En otras palabras, el algoritmo encuentra un subconjunto de aristas que forman un árbol con todos los vértices, donde el peso total de todas las aristas en el árbol es el mínimo posible. Si el grafo no es conexo, entonces el algoritmo encontrará el árbol de expansión mínimo para uno de los componentes conexos que forman dicho grafo no conexo.

// Matriz bidimensional de enteros que representa el grafo.
private int grafo[][];

/**
* Método que recorre un vector para comprobar si se encuentra en él un valor
* recibido.
* @param vector Vector de enteros donde va almacenando la solución.
* @param i Número a buscar dentro del vector.
* @return Devuelve true si lo encuentra.
*/
private boolean estaRepetido(int vector[], int i) {
for (int j = 0; j < grafo =" caminos;" numnodos =" grafo.length;" i =" 0;" longitudcamino =" 0;" menor =" 0;" actual =" inicio;" i =" 0;" menor =" i;" actual =" menor;">Solución de un problema real usando el código anterior.

El problema al cuál se da solución es encontrar el camino mínimo en una red de computadoras.

package grafos;

/***
* Camino Minimo
*
* Calcula el camino minimo
*
* @author Damian Adriel Perez Valdes
*/

import java.io.*;

public class Camino extends Grafo
{
// Matriz bidimensional de enteros que representa el grafo.
private int grafo[][];

/**
* Método contructor de la clase.
*/
public Camino(int n) {
super(n);
}

/**
* Método que recorre un vector para comprobar si se encuentra en él un valor
* recibido.
* @param vector Vector de enteros donde va almacenando la solución.
* @param i Número a buscar dentro del vector.
* @return Devuelve true si lo encuentra.
*/
private boolean estaRepetido(int vector[], int i) {
for (int j = 0; j < grafo =" caminos;" numnodos =" grafo.length;" i =" 0;" longitudcamino =" 0;" menor =" 0;" actual =" inicio;" i =" 0;" menor =" i;" actual =" menor;" lectura =" new" n =" Integer.parseInt(lectura.readLine());" gf =" new" i =" 0;" j =" 0;" i=" 0;" j =" 0;" inicio =" Integer.parseInt(lectura.readLine());">= 0)
{
//Instancia de la clase camino.
Camino c = new Camino(n);

// Encontrar el camino mínimo.
solucion = c.caminoMinimo(gf.arcos, inicio);

// Mostrar el árbol mínimo abarcador.
System.out.print("\nCAMINO MÍNIMO ABARCADOR --> Solución: ");

for (int i = 0; i < style="font-weight: bold;">Ejemplo:

Ingrese el orden de la matriz de adyacencia:
3
Ingrese elemento (0,0) : 2
Ingrese elemento (0,1) : 5
Ingrese elemento (0,2) : 6
Ingrese elemento (1,0) : 4
Ingrese elemento (1,1) : 2
Ingrese elemento (1,2) : 3
Ingrese elemento (2,0) : 4
Ingrese elemento (2,1) : 1
Ingrese elemento (2,2) : 2

Matriz de Adyacencia :

2 5 6
4 2 3
4 1 2

Ingrese Nodo de Inicio :
2

CAMINO MÍNIMO ABARCADOR --> Solución: 2 1 1 2 5 6
4 2 3
4 1 2

jueves, 2 de agosto de 2007

Los Frameworks de PHP agilizan tu trabajo II

Se ha publicado el Maestros del Web el segundo articulo “Los Frameworks de PHP agilizan tu trabajo”.

Existen al rededor de 40 Frameworks para PHP y cada uno tiene funciones distintas. En los dos artículos sobre cómo los Frameworks en PHP agilizan tu trabajo, se mencionan los más utilizados y populares. Descubre la segunda parte.

Los invito a leer más: Maestros del Web >> Los Frameworks de PHP agilizan tu trabajoII

martes, 31 de julio de 2007

Los Frameworks de PHP agilizan tu trabajo

En Maestros del Web se publicó el articulo “Los Frameworks de PHP agilizan tu trabajo”.

Los Frameworks ayudan en el desarrollo de software, proporcionan una estructura definida la cual ayuda a crear aplicaciones con mayor rapidez. Ayuda a la hora de realizar el mantenimiento del sitio gracias a la organización durante el desarrollo de la aplicación.

Los invito a leer más: Maestros del Web >> Los Frameworks de PHP agilizan tu trabajo

martes, 3 de julio de 2007

¿Qué es Javascript?

En Maestros del Web podemos encontrar un articulo que nos habla sobre ¿Qué es Javascript?. Javascript es un lenguaje de programación que permite a los desarrolladores crear acciones en sus páginas web. Pero ¿Qué es Javascript?, ¿Cómo nace Javascript? son algunas de la preguntas que el siguiente artículo intenta resolver.

Lea más en: Maestros del Web >> ¿Qué es Javascript?

viernes, 15 de junio de 2007

Validar dirección de correo electronico con PHP

Si queremos insertar un formulario y en el incluir un campo que recoja el Email del usuario, podemos usar el siguiente código para comprobar si es válido.


Este código está desarrollado en PHP, el mismo cuenta con una clase llamada “Validador_Email” con un método “comprobar_mail”.

class Validador_Email
{
var $email;
var $exp_reg;

function comprobar_email()
{
$this->exp_reg = “^[[:alnum:]_-]+”;
$this->exp_reg .= “(\.[[:alnum:]_-]+){0,}”;
$this->exp_reg .= “@”;
$this->exp_reg .= “[[:alnum:]_-]+”;
$this->exp_reg .= “(\.[[:alnum:]_-]+){0,}”;
$this->exp_reg .= “(\.[[:alpha:]]{2,3})$”;

if ( ereg ( $this->exp_reg , $this->email ) )
{
return (true);
}
else
{
return (false);
}
}
}

// Inicializamos un objeto de la clase “Validador_Email”

validar = new Validador_Email();

// Asignamos el correo :

$validar->email = “correo@mail.com”;

//Comprobamos si la direccion de correo electronica es verdadera o falsa

$retorno = $validar->comprobar_email();

//Si es verdadera devuelve “True”, sino “False”

if ( $retorno == false )
{
echo “Email erróneo”;
}
else
{
echo “Email correcto”;
}
?>

Espero que queden complacidos con este codigo. Y así puedan realizar validaciones en sus formularios.

viernes, 8 de junio de 2007

Crear un Reporte en Delphi

Usted puede utilizar informes ambos el VCL y el CLX para generar informes de la base de datos y en desarrollos que no tengan bases de datos. El procedimiento siguiente explica cómo agregar un informe simple a unprograma existente con base de datos.

1. Abra un programa con base de datos en Delphi.
2. Desde la página de componentes de RAVE, agregue el componente de TRvDataSetConnection a una forma en el programa.
3. En las propiedades del objeto TRvDataSetConnection, fije la propiedad del dataSet a un componente dataset que ya esté definido en su aplicación.
4. Ahora debemos diseñar el informe y crear un archivo de informe (archivo con extensiónl .rav).

A. Elija desde Delphi la opción que se encuentra en Tools|Rave para lanzar al diseñador de la
presentación visual de Rave.
B. Seleccione File|New para exhibir la caja de diálogo DATA CONNECTIONS.
C.En la lista de Data Object Type, seleccione Direct Data View y presione en siguiente (Next)
D. En la lista de conexiones de datos activas, seleccione RVDataSetConnection1 y presione en Finalizar.
E.En el árbol del proyecto en el lado izquierdo de la ventana del diseñador visual RAVE, expanda el nodo Data View Dictionary, entonces nuevamente expanda el nodo creado DataView1. Los campos de datos de su aplicación serán desplegados debajo del nodo DataView1.

F.En el menu de Rave seleccione Tools|Report y luego Wizards|Simple para exhibir el asistente.
G.Seleccione DataView1 y el presione en siguiente.
H.Seleccione los campos que desee exhibir en el informe y
presione en siguiente (next).
I. Siga los avisos en las páginas subsecuentes del asistente para fijar el orden de los campos, márgenes, dirección del texto, y las fuentes que se utilizarán en el informe (reduzca tamaños porque los que presenta por defecto en los títulos son inmensos).
J. En la página final del asistente, presione en generar (Generate) para terminar el asistentey exhibir el informe en el diseñador de página.

K. Elija File|Save para exhibir la caja de diálogo salvar. Navegue al directorio en el cual su aplicación de Delphi está situada y salve el archivo de proyecto de RAVE con el nombre que quiera, por ejemplo miarchivo.rav.
Minimice Rave y vuelva a Delphi.

5 Otra vez en Delphi desde la página de componentes de Rave, agregue el componente Rave project, TRvProject, a la forma.
6 En el inspector del objetos, fije la propiedad ProjectFile al archivo del informe (por ejemplo miarchivo.rav) que usted creó previamente.
7 Desde la página estándar de la paleta de componentes, agregue el componente de Tbutton.
8 En las propiedades del objeto Tbutton, seleccione la lengueta de los Eventos y escoja el evento de OnClick.
9 Escriba un evento que utilice el método de ExecuteReport para ejecutar el componente del proyecto Rave. Mejor dicho escriba RvProject1.execute; ( RvProject1 es el nombre del componente agregado en el paso 5).

10 Corra la aplicación (Press F9 to run the application).
11 Click en el botón que usted adicionó en el paso 7.
12 El cuadro de dialogo opciones de impresión es mostrado. Click OK para ver el reporte.

jueves, 7 de junio de 2007

Acceder a una BD MS Access con Delphi

Este artículo muestra paso a paso cómo conectar con bases de datos Microsoft Access desde Delphi. Para ello utilizaremos ODBC (Open Database Connectivity) .
  • En primer lugar necesitaremos disponer del Driver ODBC para acceso a Microsoft Access.
  • Crearemos la Base de Datos Microsoft Access (mdb).
  • Añadiremos el Driver ODBC para acceso a la BD creada, desde “Inicio” - “Configuración” “Panel de control” - “Herramientas administrativas” - “Orígenes de datos (ODBC)”, en la pestaña “DNS de sistema” pulsaremos en “Agregar”, seleccionaremos “Microsoft Access Driver (*.mdb), pulsaremos en “Finalizar” y rellenaremos los siguientes datos:

Nombre del origen de datos: será el nombre que utlizaremos en Delphi para enlazar el ODBC creado con el Database, en nuestro caso BDAccessInventario.

Descripción: comentario informativo.

A continuación pulsaremos en el botón “Seleccionar” para especificar la base de datos Access a la que nos conectaremos.

  1. Abrimos Delphi y pulsamos en “File” - “New” - “Application”. Añadiremos un módulo de datos (data module) para colocar los componentes necesarios para el acceso a Access, para ello pulsaremos en “File” - “New” - “Data Module”. A continuación añadiremos al módulo de datos los siguientes componentes para acceso a Bases de Datos:

    • En la paleta de componentes, en la pestaña “BDE”, seleccionaremos “Database” y lo añadiremos al módulo de datos. Este componente será el encargado de enlazar nuestra aplicación con el Driver ODBC creado anteriormente. Para ello haremos doble clic sobre el “Database”:

En “Alias name” seleccionaremos el ODBC creado anteriormente (BDprueba) y pulsaremos el botón “Defaults” para que nos añada automáticamente los parámetros necesarios para la conexión:

DATABASE NAME=
USER NAME=
ODBC DSN=BDAccessInventario
OPEN MODE=READ/WRITE
SCHEMA CACHE SIZE=8
SQLQRYMODE=
LANGDRIVER=
SQLPASSTHRU MODE=SHARED AUTOCOMMIT
SCHEMA CACHE TIME=-1
MAX ROWS=-1
BATCH COUNT=200
ENABLE SCHEMA CACHE=FALSE
SCHEMA CACHE DIR=
ENABLE BCD=FALSE
ROWSET SIZE=20
BLOBS TO CACHE=64
PASSWORD=

Por supuesto estos parámetros pueden ser modificados por código.

Desmarcaremos la opción “Login prompt” = “False” (para que no nos aparezca la ventana de Usuario y Contraseña cada vez que nos conectemos, deberemos activar esta opción si hemos añadido usuarios a la BD Access). Luego pulsamos “OK”.

Ahora mostraremos las propiedades del Database, deberemos introducir un nombre a la Base de Datos (que será el que se utilice en Delphi), para ello lo escribiremos en la propiedad “DatabaseName”, en nuestro caso “bd.mdb”:

Para probar la conexión cambiaremos la propiedad “Connected” = “True”, si nos deja cambiarla significará que la conexión ha sido satisfactoria en caso contrario mostrará un mensaje con el error.

- En la paleta de componentes, en la pestaña “BDE”, seleccionaremos “Table” y lo añadiremos al módulo de datos. Este componente será el encargado de enlazar con el Database y será el que nos proporcione los datos que necesitemos de la tabla que especifiquemos. Las propiedades que cambiaremos para que funcione serán:

  • “DatabaseName”: nombre que hemos dado a la propiedad “DatabaseName” del Database creado anteriormente.
  • “TableName”: si no ha habido errores y la conexión se ha establecido correctamente con la BD Access, podremos pulsar en el desplegable de “TableName” y seleccionar la tabla de la BD Access a la que queramos acceder.
  • “Active”: si ponemos a “True” esta propiedad abriremos la tabla seleccionada en “TableName”.

Por último añadiremos un “DataSource”, ubicado en la pestaña “Data Access”. Este componente es sólo necesario si vamos a utlizar componentes visuales para mostrar o modificar los datos. Con lo cual se utiliza para enlazar el Table con los componentes visuales. La única propidad imprescidible de éste es:

  • “DataSet”: pulsaremos en en desplegable y seleccionaremos el Table añadido anteriormente, en nuestro caso, puesto que no hemos modificado la propiedad “Name”, se llama “Table1″.
Tras añadir estos tres componentes no visuales en el Módulo de Datos, ahora añadiremos en el formulario un par de componentes visuales para poder mostrar y manipular los datos de la Base de Datos Access. Para ello mostramos el formulario, pulsando “Mayúsculas + F12″ o el menú “View” - “Forms” y seleccionamos el formulario que se crea automáticamente al crear el proyecto:
Antes de añadir los componentes visuales, puesto que estos necesitarán estar enlazados con el componente “DataSource” del módulo de datos, deberos colocar el módulo de datos en la claúsula USES del formulario, para ello es suficiente con pulsar en “File” - “Use Unit” y seleccionar el módulo de datos (”Unit2″ si lo hemos guardado con este nombre):
Desde la paleta de componentes, pestaña “Data Controls” seleccionaremos “DBGrid”, lo añadiremos al formulario y modificaremos la propiedad “DataSource”. En el desplegable de la misma nos aparecerá “DataModule2.DataSource1″ (en nuestro caso). Trase seleccionare el “DataSource” ya tendremos enlazado el componente visual con su origen de datos (el DataSource, a su vez enlazado con el Table que a su vez está enlazado con el Database que a su vez está “enlazado” con el ODBC creado al principio).

Añadiremos un componente más que muestra automáticamente los botones de añadir, modificar, eliminar, refrescar, editar, validad, … registros. Este componente visual está en la pestaña “Data Controls” y se llama “DBNavigator” que también irá enlazado por la propiedad “DataSource” al “DataSource1″ del módulo de datos (DataModule2).

Una vez añadidos todos los componentes y comprobado que las propiedades “Connected” (del “Database”) y “Active” (del Table”) están a “True” compilaremos la aplicación pulsando en F9 o en el menú “Run” - “Run”. Si no ha habido errores nos aparecerá una ventana como la siguiente:

y utilizando el DBGrid prodemos añadir, modificar, eliminar y visualizar los registros de la tabla.

Por supuesto, debido a que no hemos añadido los campos (fields) al DBGrid no tenemos un control sobre las propiedades de los mismos para, por ejemplo, especificar el ancho de la columna o el título de la misma. Para realizar esto es suficiente con hacer doble clic sobre el DBGrid (en tiempo de diseño), pulsaremos el botón derecho del ratón sobre la ventana que aparece y seleccionaremos “Add All Fields”:

de esta forma se nos añadirán automáticamente todos los campos de la tabla enlazada con el DBGrid. Podemos ver las propiedades de cualquier campo:

Existe una forma más eficiente de tener un control exaustivo sobre las propiedades de los campos que queramos mostrar, se realiza desde el componente no visual “Table” (ubicado en el módulo de datos), haciendo doble clic sobre el mismo y pulsando en el botón derecho, a continuación en el menú que aparece seleccionaremos “Add all fields”:

De esta forma tendremos los campos de la tabla y todas sus propiedades en el Table para que cuando lo enlacemos con un DataSource a un componente visual (como un DBGrid) éste muestre los campos tal y como los hayamos configurado en el Table:

Desde aquí podremos modifcar propiedades como “DisplayLabel” (texto que describe al campo y que será el que el usuario vea), “DisplayWidth” (tamaño horizontal del campo, en un DBGrid será el ancho de la colunma), …

Existen otras formas de acceder a una Base de Datos Access, esta forma no necesitamos escribir codigo ni utilizar componentes adicionales. La desventaja de utilizar ODBC, es que los accesos serán más lentos que si accediésemos de forma nativa (directamente de Delphi a Microsoft Access sin pasar por ODBC ni por el BDE).

jueves, 24 de mayo de 2007

Templates
Templates