Archivo de la etiqueta: Hello world

@Chopapp para compartir código fuente

Después de un largo descanso …. Chop es una curiosa herramienta desarrollada por ZURB que te permite compartir snippets (trozos de código fuente) y recibir retro alimentación, si quieren saber por que esta app es bastante interesante les recomiendo seguir leyendo :).

chop

La idea es bastante simple y divertida, en el caso de querer mostrar nuestro codigo a alguna otra persona (similar a otros servicios como copypastecode o pastebin) y recibir algun tipo de retroalimentación tan solo tenemos que copiarlo en el formulario, elegir el lenguaje de programación adecuado y usar el botón de Chop It!, ejemplo:

chop_example1

Una vez hecho esto la aplicación nos pedirá un nombre de usuario y a continuación nos dará un link con el cual nuestros amigos podrán ver y opinar sobre nuestro código :), lo mas interesante de esta aplicación a diferencia de muchas otras que existen en el mercado es que nos permite realizar comentarios sobre el código línea por línea y no un comentario general, desde mi punto de vista es una forma bastante interesante de innovar y mejorar respecto a servicios ya existentes. El resultado final es algo como esto:

chop_example_2

Si quieren mantenerse informados sobre el desarrollo de esta aplicación pueden seguir a @chopapp

Formulario Jquery y Ajax desde 0 [PHP]

Muy bien, si haz llegado hasta esta parte del tutorial te felicito, ya casi acabas el formulario, en los post anteriores hicimos las validaciones del lado del cliente, ahora toca hacer las validaciones del lado del servidor y enviar el correo utilizando PHP.

Los post del tutorial son los siguientes:

Es un hecho que al final del día no podemos confiar en los usuarios que utilizaran la aplicación (suena mal, pero así es), existen practicas de seguridad que son básicas como por ejemplo asegurarnos que los datos que recibimos sean correctos, es decir si pedimos que el usuario ingrese un correo electrónico sea un correo electrónico valido, etc.

Tenemos que crear un nuevo archivo php, asegúrate de que el nombre sea el mismos que el que indicaste en el javascript

<?php
function validaLongitud($valor, $permiteVacio, $minimo, $maximo)
{
  $cantCar = strlen($valor);
  if(empty($valor))
  {
    if($permiteVacio) return TRUE;
    else return FALSE;
  }
  else
  {
    if($cantCar>=$minimo && $cantCar<=$maximo) return TRUE;
    else return FALSE;
  }
}

function validaCorreo($valor)
{
  if(eregi("([a-zA-Z0-9._-]{1,30})@([a-zA-Z0-9.-]{1,30})", $valor)) return TRUE;
  else return FALSE;
}

// MAIN  

if($_POST)
{
  foreach($_POST as $clave => $valor) $$clave=addslashes(trim(utf8_decode($valor)));
  sleep(5);
  if(!validaLongitud($nombre, 0, 4, 50)) $error=1;
  if(!validaLongitud($web, 1, 4, 50)) $error=1; 
  if(!validaCorreo($correo)) $error=1;
  if(!validaLongitud($comentarios, 0, 5, 500)) $error=1;
  
  if($error==1) echo "Error";
  else
  {
    $fecha=date("d/m/y - H:i");
    $mensaje="
Tienes un nuevo mensaje desde el Sitio:

Fecha: $fecha
Nombre: $nombre
Sitio web: $web
Correo electrónico: $correo
Comentarios: $comentarios";

    //Debug en un archivo ... probando haber si imprime
    
    /*$master=fopen('mensajes.txt',a);
    fwrite($master,",".$fecha.",".$nombre.",".$web.",".$correo.",".$comentarios);
    fclose($master);*/
    
    mail("[email protected]", "Comentario desde la Web", $mensaje, "From: Sitio Web <[email protected]>");
    echo "OK";
  }
}
?>

Ok, explicare el código paso por paso, al inicio del script hay 2 funciones que se utilizaran mas abajo, lo importante comienza donde esta el

if($_POST)
{

Estamos indicando que si el arreglo asociativo $_POST no esta vacío entonces ejecutaremos el código entre las llaves. La primera línea

foreach($_POST as $clave => $valor) $$clave=addslashes(trim(utf8_decode($valor)));

Foreach lo que hace es recorre el array y crear una variable por cada valor que encuentre y le asigna como nombre el mismo (similar a si utilizáramos extract($_POST); o algo similar), además de eso por seguridad le aplica la función trim que elimina espacios en blanco al inicio y al final y addslashes que agrega barras invertidas en caso de encontrar caracteres extraños como comillas simple.

Ahora realizamos las validaciones haciendo uso de las funciones de arriba

        if(!validaLongitud($nombre, 0, 4, 50)) $error=1;
  if(!validaLongitud($web, 1, 4, 50)) $error=1; 
  if(!validaCorreo($correo)) $error=1;
  if(!validaLongitud($comentarios, 0, 5, 500)) $error=1;

Las funciones validaLongitud y validaCorreo son muy similares a las que hicimos anteriormente en Javascript 🙂

function validaLongitud($valor, $permiteVacio, $minimo, $maximo)
{
  $cantCar = strlen($valor);
  if(empty($valor))
  {
    if($permiteVacio) return TRUE;
    else return FALSE;
  }
  else
  {
    if($cantCar>=$minimo && $cantCar<=$maximo) return TRUE;
    else return FALSE;
  }
}

La función recibe 4 parámetros, el valor, una variable para ver si puede estar vacía, una longitud mínima y una máxima, después obtenemos la longitud de la cadena, revisamos si la variable esta vacía y de ser así vemos si esta permitido que lo este, de ser verdadero esto regresamos true, por el otro lado si la variable no viene vacía tenemos que ver que la longitud cumpla con la longitud mínima y máxima, en cado de cumplirse la condición regresamos verdadero.

function validaCorreo($valor)
{
  if(eregi("([a-zA-Z0-9._-]{1,30})@([a-zA-Z0-9.-]{1,30})", $valor)) return TRUE;
  else return FALSE;
}

En esta función solamente se evalúa con la función eregi que la cadena $valor cumpla con las condiciones de la expresion regular, de ser cierto devolvemos true, de lo contrario false, no hay nada mas que decir.

Esta demás decir que dependiendo de si el resultado de las validaciones es verdadero o falso pondremos un 1 o dejaremos en 0 la variable $error.

Después revisamos si hubo algún error (si error es igual a 1), de ser así imprimimos con echo error, si no hubo errores procedemos a enviar el mensaje con el siguiente código.

  if($error==1) echo "Error";
  else
  {
    $fecha=date("d/m/y - H:i");
    $mensaje="
Tienes un nuevo mensaje desde el Sitio:

Fecha: $fecha
Nombre: $nombre
Sitio web: $web
Correo electrónico: $correo
Comentarios: $comentarios";

    //Debug en un archivo ... probando haber si imprime
    
    /*$master=fopen('mensajes.txt',a);
    fwrite($master,",".$fecha.",".$nombre.",".$web.",".$correo.",".$comentarios);
    fclose($master);*/
    
    mail("CORREO EJ. [email protected]", "Comentario desde la Web", $mensaje, "From: Sitio Web <[email protected]>");
    echo "OK";
  }

Lo que hacemos básicamente es armar el cuerpo del mensaje, después utilizar la función mail

mail("[email protected]", "Comentario desde la Web", $mensaje, "From: Sitio Web <[email protected]>");

La función mail envía un mensaje de acuerdo a parámetros recibidos, mas adelante aprenderemos que hay maneras mas sofisticadas de enviar correo electrónico con todas las cabeceras en orden, pero por el momento esta bien de esta manera.

Al final para avisarle al javascript (el cual hizo la petición ajax) que todo ha ido bien regresamos un OK 🙂

Y listo con esto el mensaje ha sido enviado!

Conexiones simples a mysql con JDBC en Java

Hace algún tiempo ya un amigo me pregunto que si era posible conectarse a una base de datos mysql utilizando Java, y le respondí claro que si, una opción es utilizar JDBC y el driver de mysql, hice un ejemplo bastante sencillo con el que seguro queda claro cual es la idea principal.

Lo primero que tienen que hacer es descargar el driver de conexión a mysql: mysql-connector-java-5.1.5-bin.jar y lo instalan, si utilizan eclipse es muy sencillo, tienen que copiarlo a la carpeta de su proyecto y después hacer clic con el botón secundario en su proyecto y seleccionar Build Path > Libraries > Add Jars y agregan su archivo :).

Después de eso pueden probar este pequeño código de ejemplo.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class jdbcExample {

  Connection newDB;

  void getStates()
  {
        try {

            Statement STMT1 = newDB.createStatement();
            String SQLQuery = "SELECT name FROM states";
            ResultSet RX = STMT1.executeQuery(SQLQuery);

            while (RX.next()) {
                System.out.println(RX.getString("name"));
            }
        }
        catch(SQLException e) {

        }
  }

  void insertState(String name) {
    name = name.trim();
        if (name.length() &gt; 0) {
            try {
                Statement STMT = newDB.createStatement();

                String SQLQuery = "INSERT INTO states (name) VALUES ('" + name + "');";
                STMT.executeUpdate(SQLQuery);
                System.out.println("Se agrego un nuevo estado: " + name);
            }
            catch (SQLException e) {
                System.out.println("ERROR AL INSERTAR NUEVO ESTADO " + e.toString());
            }
        }
    }

  void removeState(String name)
  {
        try {

            Statement STMT1 = newDB.createStatement();
            String SQLQuery = "DELETE FROM states WHERE name = '" + name + "'";
            STMT1.executeUpdate(SQLQuery);

            System.out.println("Se elimino el estado: " + name);
        }
        catch(SQLException e) {
          System.out.println("ERROR AL BORRAR ESTADO " + e.toString());
        }
  }

  void performConnection() {

        String new_hostName = "127.0.0.1";
        String new_userName = "root";
        String new_password = "";
        String new_dataBase = "zonauPruebas";

        try {

          Class.forName("com.mysql.jdbc.Driver");

            String newConnectionURL = "jdbc:mysql://" + new_hostName + "/" + new_dataBase + "?" + "user=" + new_userName + "&amp;password=" + new_password;
            newDB = DriverManager.getConnection(newConnectionURL);

      } catch (SQLException e) {
        System.out.println("SQL Exception: " + e.toString());
      } catch (ClassNotFoundException cE) {
        System.out.println("Class Not Found Exception: " + cE.toString());
      }

      //obteniendo datos
      getStates();
      insertState("Java Town");
      removeState("Java Town");
  }

    public static void main(String[] args) {
      jdbcExample nuevaConexion = new jdbcExample();
        nuevaConexion.performConnection();
    }
}

Ok para los que ya están familiarizados con java les resultara muy sencillo de entender, para los que aquí va la explicación, (omitiré la parte de los imports de librerías por obvias razones xD).
public class jdbcExample {

  Connection newDB;

Al inicio de creo una nueva variable de clase de tipo Connection, desde aquí comenzamos a hacer uso de la maravilloso de los objetos :p.
void performConnection() {

        String new_hostName = "127.0.0.1";
        String new_userName = "root";
        String new_password = "";
        String new_dataBase = "zonauPruebas";

        try {

          Class.forName("com.mysql.jdbc.Driver");

            String newConnectionURL = "jdbc:mysql://" + new_hostName + "/" + new_dataBase + "?" + "user=" + new_userName + "&amp;password=" + new_password;
            newDB = DriverManager.getConnection(newConnectionURL);

      } catch (SQLException e) {
        System.out.println("SQL Exception: " + e.toString());
      } catch (ClassNotFoundException cE) {
        System.out.println("Class Not Found Exception: " + cE.toString());
      }

      //obteniendo datos
      getStates();
      insertState("Java Town");
      removeState("Java Town");
  }

Después, esta es la parte mas importante del código, aquí es donde establecemos la conexión a la base de datos, es especial esta

String newConnectionURL = "jdbc:mysql://" + new_hostName + "/" + new_dataBase + "?" + "user=" + new_userName + "&amp;password=" + new_password;

Donde utilizamos el protocolo JDBC para conectarnos.

Después mas abajo verán la parte donde se mandan llamar métodos de la <strong>clase</strong>

    getStates();
      insertState("Java Town");
      removeState("Java Town");

Ahora explico lo que hace cada uno de ellos, el primero hace un SELECT, el segundo un INSERT y el tercero un DELETE.
void getStates()
{
        try {

            Statement STMT1 = newDB.createStatement();
            String SQLQuery = "SELECT name FROM states";
            ResultSet RX = STMT1.executeQuery(SQLQuery);

            while (RX.next()) {
                System.out.println(RX.getString("name"));
            }
        }
        catch(SQLException e) {

        }
}

Como el código lo indica, creamos un nuevo dato de tipo Statement, armamos nuestra Query y al final realizamos la consulta (el SELECT) utilizando executeQuery y guardamos el resultado en un ResultSet que al final recorreremos utilizando un While, imprimimos el contenido con getString, esto implícitamente funciona moviendo un apuntador a través del ResulSet pero eso es otra historia xD.
void insertState(String name) {
    name = name.trim();
        if (name.length() &gt; 0) {
            try {
                Statement STMT = newDB.createStatement();

                String SQLQuery = "INSERT INTO states (name) VALUES ('" + name + "');";
                STMT.executeUpdate(SQLQuery);
                System.out.println("Se agrego un nuevo estado: " + name);
            }
            catch (SQLException e) {
                System.out.println("ERROR AL INSERTAR NUEVO ESTADO " + e.toString());
            }
        }
}

En este método al igual que en el anterior utilizamos un Statement, pero recibimos como parámetro un string, le aplicamos el método trim() que remueve espacios al inicio y al final de la cadena, después armamos nuestra consulta agregando el string de la variable name y la ejecutamos con executeUpdate

Entonces hasta ahorita ya deberían de saber como recuperar datos y como agregarlos de una base de datos :p, vamos por la tercera que seria eliminarlos.

void removeState(String name)
  {
        try {

            Statement STMT1 = newDB.createStatement();
            String SQLQuery = "DELETE FROM states WHERE name = '" + name + "'";
            STMT1.executeUpdate(SQLQuery);

            System.out.println("Se elimino el estado: " + name);
        }
        catch(SQLException e) {
          System.out.println("ERROR AL BORRAR ESTADO " + e.toString());
        }
}

Es igual al método anterior solo que ahora la consulta en lugar de contener un INSERT será un DELETE :).
    public static void main(String[] args) {
      jdbcExample nuevaConexion = new jdbcExample();
        nuevaConexion.performConnection();
    }

Al final creamos nuestro tan importante método main (se rumora que una vez un programador hizo un programa con 3 mains O.o???), y creamos una nueva instancia de nuestra clase y después ejecutamos el método performConnection() que realiza la conexión.

Bueno hasta aqui este mega tutorial relámpago de conexiones a bases de datos mysql con JDBC en Java, me voy a dormir, espero les sirva y cualquier duda comenten por favor.

Aquí les dejo el código sql de la tabla que utilice en el ejemplo para si ustedes quieren utilizarla.

Les recuerdo que aun esta en pie el concurso Ganate una cuenta premium de megaupload GRATIS

salu2

Mi opinion acerca de Anonymous mexico

Este año ha comenzado mas agitado que de costumbre, iniciando con las noticias y las nuevas tendencias del malware firmado, paquetes de crimeware que son vendidos casi a la luz del día y los grupos hacktivistas que están a la orden del día.

Me he decidido a escribir este articulo, que refleja enteramente mi opinión personal y la manera en la que yo observo las cosas debido a en esta ocasión la gente de Anonymous entro en escenario mexicano, o al menos gente que utiliza su insignia. Y es que este grupo como otros (Lulzec, por ejemplo) tienen cierta filosofía que para algunas personas podría ser moral mente correcta y para otras no, yo en lo personal converjo con la idea de no caer en el conformismo, no dejarme “pisotear” por el gobierno y salir adelante por mis propios méritos, lo que si no me parece es que este tipo de grupos vaya por la red predicando acerca de la liberación, la independencia y el libre albedrío (no ser un ladrillo mas del muro) y aun así utilicen al pueblo, a las masas como simple ganado o carne de cañón para realizar sus ataques distribuidos de denegación de servicios.

Por si fuera poco el pueblo es como una manada de búfalos, tan solo hace falta seguir a su líder y no vacilaran en aventarse por un precipicio, ojo que no estoy diciendo que nos tenemos que conformar con nuestra situación actual, el narcotráfico, la inseguridad, etc y todo eso que nos ponen frente a los ojos, lo que trato de decir es que no tenemos que seguir estúpidamente al primer Mesías que venga ante nosotros solamente por que nos dice “oye tu, si tu, me voy a enfrentar al gobierno, ¿me ayudas?”, simplemente esa no es la manera correcta de hacer las cosas.

Díganme ustedes, ¿de que sirve realizar un ataque de denegación de servicios?, ¿acaso vas a dejar tus scripts corriendo todo un mes?, en cuanto dejes de DOSEAR el sitio vuelve a estar en pie y nada paso, simplemente, realizar un DDOS es algo estúpido, lo vean por donde lo vean, y lo peor de todo es como ya mencione utilizan al pueblo para hacer el trabajo sucio, un pueblo que no tiene ni $·&$&$ idea de lo que esta haciendo, un pueblo fácilmente manipulable al cual le puedes decir: descarga este programita de samelpirata.com, instálalo, pon esta url y pícale en GO.

La verdad que me entristece entrar a los canales IRC o seguir los #hashtag de #OpIndependencia en twitter donde supuestamente miembros de anonymous están dando ordenes como “New Target”, “Tango Down”, “take down”, y cosas por el estilo y la gran cantidad de gente que tontamente esta contribuyendo en algo que están muy lejos de comprender y peor aun de entender su funcionamiento, por lo que llegue a una conclusión.

Al pueblo le gusta formar parte de algo, de algo grande aunque no tenga ni %&/(%& idea de ello, “Ya calificamos para el mundial“, “ganamos contra X país”, ¿Que ganaste?,¿En que calificaste?, ahora si que every man for himself, sálvese quien pueda, en pocas palabras comienza a hacer algo por ti mismo y no intentes cambiar el mundo que no podrás (aun no ;)).

La verdadera razón por la que se organizan este tipo de ataques es para atraer publicidad y causar polémica, ¿por que mas va a ser?, lanzar noticias nuevas y frescas a los medios es algo muy importante cuando quieres causar distracción, la verdadera gente de Anonymous les aseguro que son gente que estudio, ingenieros, doctores, maestros, gente muy bien preparada que no tiene el tiempo ni les resulta útil ser tweetstars o andar publicando videos en youtube, la gente que realiza estas acciones, y esto se los puedo asegurar son personas que tienen muy pocos o nulos conocimientos de informática, aprendieron a utilizar un troyano, escribir scripts en batch y alardean de ser hackers, obviamente no entienden la diferencia entre un hacker y un script kiddie ;).

Si bien ustedes saben, yo he pertenecido a grupos de ciber hacktivismo y es algo totalmente diferente, aunque no diga que sea bueno o correcto, ¿por que es diferente? para empezar en aquellos tiempos éramos mas organizados y no incitábamos a las masas a que descargaran y utilizaran software que probablemente esta infectado, se tenían objetivos bien definidos y no se anunciaba en los medios.

En resumen y ya para terminar no se dejen llevar por la corriente, no se involucren con la moda Anonymous pensando que lo saben todo solamente por que saben usar un programa llamado LOIC, manténganse informados acerca de lo que sucede a su alrededor y sobre todo no se dejen manipular tan vil mente como lo esta haciendo Anonymous en la actualidad.

Ganate una cuenta premium de megaupload GRATIS

Hola estimados lectores (amigos) como todos se habrán dado cuenta estoy haciendo cambios por aquí, me estoy mudando de hosting y por eso mis sitios han estado caídos varios dias jejeje, sin embargo para compensarlos he decidido lanzar un concurso :).

La persona que resulte ganadora obtendrá una cuenta premium de megaupload totalmente gratis por 1 mes que yo le obsequiare :).

Además si te registraste antes del 30 de septiembre y resultaste ser el ganador tienes un premio secreto extra, que se dará a conocer ese mismo día :p.

Pero, por si eso no fuera suficiente, si ganaste y eres blogger te ganas automáticamente 1 reseña y 1 enlace (tu blog tiene que ser de temáticas aceptadas por adsense).

El concurso por la cuenta premium de megaupload termina oficialmente termina el 24 de octubre de 2011.

Para participar tienes que seguir 3 sencillos pasos:

Paso #1

Accede al sitio de Microsoft Virtual Academy, después tienes que hacer clic en el link para registrarte en la plataforma

Validas con tu cuenta de windows live como te indican.

Después se te pedirá que ingreses tu nombre, apellido, correo electrónico y país para completar tu registro, llena los campos como se indica.

Si todo salió bien el sistema te pedirá que verifiques tu cuenta de correo (la que pusiste al registrarte) 🙂

Después de ver ese mensaje, ATENCION, esta es de las partes mas importantes :p, tienes que ir a tu bandeja de entrada (del correo con el que te registraste) y veras que te ha llegado un correo con asunto [MVA] Registro

.

Revisa ese mail y en la parte de arriba te aparecerá Tu registro se ha completado con éxito., eso quiere decir que realizaste todos los pasos de manera correcto, ahora solo tienes que hacer clic en el enlace (liga, link) que te dice Ingresa aquí para activar tu cuenta en Microsoft Virtual Academy :).

El link te re direccionara y te mostrara un mensaje con lo siguiente:

.

Paso #2

Realiza un comentario en esta entrada expresando que estas participando en el concurso, esto es muy importante ya que el sorte se realizara de manera aleatoria en base al numero de comentarios utilizando www.randomizer.org, por ejemplo si el numero generado aleatoriamente es el 50, la persona que haya escrito el comentario 50 será la ganadora.

Es importante que escribas tu nombre y tu correo (si es con el que te registraste en Microsoft Virtual Academy que mejor) para que en caso de resultar ser el ganador yo te pueda contactar :).

Después, opcionalmente puedes seguirme en twitter @Alevsk o hacerte fan en facebook Alevsk

Paso 3

Tienes que enviarme un correo electrónico a [email protected] (copia y pega esta dirección cuando vayas a escribir tu correo), atención, debe ser ha esa dirección de correo en particular :), con el asunto Participando para cuenta premium de megaupload, donde incluyas el correo con el que te registraste en Microsoft Virtual Academy en el paso 2.

Y eso es todo, estarás participando en el concurso.

PD Cualquier duda, puedes enviarme un tweet a @Alevsk o un correo a [email protected] con el asunto Duda concurso Megaupload y yo te responderé a la brevedad posible 🙂