Problemas con VIM: E575: viminfo

He aquí un caso nuevo para mí, resulta que mi hermano necesitaba modificar unas líneas del archivo de configuración del firewall que hice en uno de sus servidores pero cuando abría el archivo con vim este arrojaba unas líneas extrañas, por lo cuál me llamo y me comentó del error rápidamente me imagine el clásico escenario que se cierra el archivo mal y se queda por ahí el .swp pero cuando me da la descripción detalla veo que algo que no había visto, por lo cual le pedí acceso para revisarlo

y efectivamente el error era otro, al darle al comando

vim /etc/init.d/firewall.sh

Marcaba líneas como estas:

E575: viminfo: Illegal starting char in line: ifconfig
E575: viminfo: Illegal starting char in line: cd /usr/src/linux
E575: viminfo: Illegal starting char in line: make modules  &&  make modules_install
E575: viminfo: Illegal starting char in line: ifconfig

Cuándo lo vi me asuste, pues pensé que había sido algún tipo de ataque que consistía en recompilar el kernel, pero haciendo memoria me acorde de que yo había compilado los módulos para levantar unas tarjetas de red, así que decidí documentarme un poco sobre este error así que me fui al google y en los primeros resultados encontré la solución.

Resulta que hay un archivo de historial para vim que se guarda en ~/.viminfo y este esta dañado y para solucionarlo solo había que borrarlo pues no me interesa el historial y así de fácil se solucionó

No sabía que vim guardaba un tipo de historial, si me queda tiempo buscaré que objetivo tiene esta funcionalidad del editor.

saludos

 

Encuentra en registros repetidos en una tabla

En base de datos raramente :P tenemos problemas con registros repetidos, comunmente me ha tocado ver el caso de catálogos, por ejemplo un caso de registros repetidos en un catálogo de paises es que tengamos 2 veces México, 2 veces España, etc pero con distinta llave foranea cada uno de ellos y cuando entramos en tareas de depuración buscar estos registros a mano puede llevarse tiempo pero si utilizamos este query que ya no recuerdo de dónde lo copie :P nos puede ayudar a sacar esta chamba en menos tiempo

 

En los campos de la segunda clausula where debemos indicar cuales campos son los que buscamos que estan repetidos y de este modo nos traerá el listado de id que  lo estan

SELECT id
 FROM   tabla AS tabla1
 WHERE  id > (SELECT MIN(id)
             FROM   tabla AS tbl1
             WHERE  tabla1.campo1 = tbl1.campo1
                    AND tabla1.campo2 = tbl1.campo2
                    AND tabla1.campon = tbl1.campon)

Ahora si bien se nos pueden presentar casos en dónde no existe llave primaria podemos utilizar este otro query que resolverá la problematica

Aquí el truco consiste en agrupar aquellos campos que son los que pueden estar repetidos

SELECT campo1,
       campo2,
       campo3,
       COUNT(*) AS registros
 FROM   tabla
 GROUP  BY campo1,
          campo2,
          campo3
 HAVING COUNT(*) > 1

Espero que estos códigos les sean útiles.

Volviendo a la actividad

Después de un buen rato sin postear, aquí ando de nuevo, la razón por la cuál no había tenido actividad es porque cambie de trabajo y el tiempo de adaptación fué mas largo de lo pensado pero bueno al grano, ahora en mi trabajo estoy a cargo de las Bases de Datos y hasta el momento todas las que me han ido pasando han sido en SQL Server y me he estado encontrando con una serie de necesidades para darles mantenimiento por lo cuál pondré aquí aquellos scripts que me hayan sido de gran utilidad esperando que a alguien mas le sirvan

Para empezar pondre aquí uno muy útil cuando de Stored Procedures se trata, consiste en localizar texto en el cuerpo de todos los SP de una Base De Datos

USE MiBaseDeDatos 
go
SELECT ROUTINE_NAME, ROUTINE_DEFINITION, *
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_DEFINITION LIKE '%texto a buscar%'
AND ROUTINE_TYPE='PROCEDURE'

Lo he usado en SQL Server 2008 y 2005 y ha funcionado en las versiones anteriores a estas no las he probado aún, en caso de que algún día lo haga, editaré el post

saludos

Usando PHPMailer

Desde hace algún tiempo llevo usando la clase PHPMailer para el envío de correos desde sistemas hechos en PHP por desgracia siempre que la ocupo es por solo algunos momento que para los pocos días su sintaxis se me olvida, por lo cuál he decidio ponerla aquí para que me quede de respaldo.

Bueno antes de comenzar cabe mencionar que estoy usando PHPMailer v5.1 y  funciona para PHP 5 y 6 la pueden descargar de aquí

Ahora a si a comenzar con un ejemplo práctico, el cuál envía un correo electrónico utilizando el SMTP de Gmail

<?php
//incluir el codigo de la clase PHPMailer
require_once 'PHPMailer_v5.1/class.phpmailer.php';
 
//Se crea el objeto PHPMailer
$mail = new PHPMailer();
 
//se activa el SMTP
$mail->IsSMTP();
 
//se activa la autenticación
$mail->SMTPAuth = true;
 
//se activa la transferencia segura, requerida por gmail
$mail->SMTPSecure = 'ssl';
 
//se asigna dirección del smtp
$mail->Host = 'smtp.gmail.com';
 
//se asigna el puerto de envío
$mail->Port = 465;
 
//se asigna el usuario de la cuenta de correo
$mail->Username = 'miCuentaParaPHPMailer@gmail.com';
 
//se asigna el password de la cuenta de correo
$mail->Password = 'superPasswordSeguro';
 
//se asigna el correo y el nombre  que aparecerá en la parte de
// "Enviado Por"
//se aplica la función utf8_decode para que los acentos se impriman bien
$mail->SetFrom('sistema@informatico.com', utf8_decode('Sistema Informático'));
 
//se asigna un tiempo limite para envío de correo
$mail->Timeout = 30;
 
//se activa el soporte de HTML
$mail->isHTML(true);
 
//se asigna un correo destino
$mail->AddAddress('ivan@rico.org.mx','Iván Rico');
 
//se asigna el cuerpo del mensaje
$mail->Body = '<h1>Cuerpo de Correo enviado desde PHP</h1><p>Este esto es una prueba</p>';
 
//se asigna el asunto del mensaje
$mail->Subject = 'Correo Enviado desde PHP';
 
try {
    //se manda el mensaje
    if(!$mail->Send()) {
        throw new Exception('Error: '.$mail->ErrorInfo);
    }
}
catch (Exception $e ){
     echo $e->getMessage();
}

En lo particular me gusta usar el servicio de SMTP de Gmail porque brinda algunas ventajas por ejemplo, gmail dificilmente estará en las listas negras otra puede ser que la dirección IP de mi servidor no estará esparciendose por ahí y esto ayuda a reducir las probabilidades de caer en alguna actividad maligna en el servidor PHP :P

Un poco sobre la Clase DateTime de PHP

Desde la versión de PHP 5.2 ya hay soporte estable para la clase DateTime que es muy útil al momento de trabajar con fechas y horas, de lo más relevante que he podido utilizar en esta clase ha sido el cálculo de diferencia de días entre 2 fechas distintas pero ademas se pueden hacer algunas operaciones como la de sumar y restar. Vamos a ver unos ejemplillos.

Primero que nada lo que tenemos que hacer es definir nuestra Zona Horaria esto se hace en el archivo php.ini en la sección Date

[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = America/Monterrey

Si no podemos cambiar esta info porque no somos adminstradores del servidor PHP podemos hacerlo durante la ejecución con la función date_default_timezone_set

Muy bien, ya configurado esto podemos hacer uso de la clase sin problemas.

El ejemplo mas sencillo que podemos hacer es el de crear el objeto e imprimirlo

<?php
date_default_timezone_set('America/Monterrey');
 
$dateTime = new DateTime(); //Se genera objeto con  la fecha actual
echo $dateTime->format("Y-m-d H:i:s");

Podemos generar el objeto con una fecha especifica si asi lo deseamos o podemos utilizar algunas cadenas:

$hoy = new DateTime('now');
echo "\n". $hoy->format("Y-m-d H:i:s");
 
$ayer = new DateTime('yesterday');
echo "\n". $ayer->format("Y-m-d H:i:s");
 
$maniana = new DateTime('tomorrow');
echo "\n". $maniana->format("Y-m-d H:i:s");

Para hacer operaciones con las fechas podemos utilizar los métodos:

  • DateTime::add (soportada desde la versión 5.3)
  • DateTime::sub (soportada desde la versión 5.3)
  • DateTime::modify (soportada desde la versión 5.2)

Lo fantastico de esto es que detecta los años bisiestos así como el cambio de mes

<?php
$dateTime = new DateTime('2011-01-25');
$dateTime->add(new DateInterval('P10D')); //PERIOD 10 DAYS
echo "\n".$dateTime->format('Y-m-d'); //Esto imprime 2011-02-04

Si contamos solo con la versión 5.2 podemos utilizar el método modify para hacer operaciones

<?php
//Probando año bisiesto
$date = new DateTime("2012-02-28");
$date->modify("+1 day");
echo  "\n". $date->format("Y-m-d"); //imprime 2012-02-29
 
//Probando cambio de año
 
$date = new DateTime("2011-01-05");
$date->modify("-10 day");
echo  "\n". $date->format("Y-m-d"); //imprime 2010-12-26

Obtener la diferencia entre 2 fechas

<?php
$fecha1 = new DateTime('2011-01-01');
$fecha2 = new DateTime('2011-05-03');
$intervalo = $fecha1->diff($fecha2);
echo "\n".$intervalo->format('%R%a días'); //Imprime 122 días

 
Para conocer mas sobre el alcance de la clase pueden leerse el manual oficial

Sintaxis alternativa para estructuras de control en PHP

Bueno seguramente muchos ya conocen de lo que voy a explicar, pero como quiera lo pongo porque suelo olvidarlo y ahí ando googleando para recordarlo xD

Comencemos:

PHP soporta una sintaxis distinta a la ya conocida de las estructuras de control:

  • if
  • while
  • foreach
  • for
  • swtich

todos los phperos conocemos que el cuerpo de cada estructura va entre llaves “{ }” pero en PHP 5 se incluyo el soporte para iniciar el cuerpo con dos puntos (:) y para finalizar con la palabra reservada endif, enfwhile, etc dependiendo lo que se este usando.

Veamos un ejemplo

$variable  = 1;
 
if ($variable == 1 ) : //con ":" iniciamos
 
echo 'la variable equivale a '.$variable;
 
endif;  // con esta palabra finalizamos
 
//esto es lo mismo que
 
if ($variable == 1 ) {
 
echo 'la variable equivale a '.$variable;
 
}

Sencillo no??

Ahora bien tal vez nos viene a la mente, y para que nos sirve tener esta forma alternativa si ya todos conocemos la tradicional y funciona muy bien, bueno una posible respuesta y muy válida sería la utilización de esto en bloques HTML dónde tienes que revolver ambos lenguajes, veamos un ejemplo un poco mas práctico:

;
<?php
 
/* Mostrar un listado de las distribuciones del Canterbury Project */
 
//formamos un arreglo
 
$distros = array('Debian', 'OpenSUSE', 'Gentoo', 'Arch','Grml');
 
?>;
 
<html>
 
<head></head>
 
<body>
 
<p>Las distribuciones que nos la hicieron fueron:</p>
 
<table>
 
<?php foreach ($distros as $distro ) : ?>
 
    <td><?php echo $distro ?></td>
 
<?php endforeach ?>
 
</table>
</body>
</html>

Cómo pueden observar en el bloque de HTML que puse se puede apreciar de forma rápida dónde finaliza la sentencia foreach lo cuál aventaja a si ponemos simplemente la llave que cierra “}

Yo lo veo muy útil para utilizarlo en la parte de la vista osea en las plantillas o cosas por el estilo.

bueno por el momento es todo. Saludos

Utilizando CURL en PHP

Hace algunos meses que quería explorar esta librería de cURL pero no había tenido en mis manos algún proyecto que la requiriera, pero tenía la esperanza de que pronto se llegará uno y así fue, hace algunas horas diseñe una rutina simple en PHP que hace uso de la librería para hacer tan solo la prueba del concepto.

La prueba fué muy sencilla, nada del otro mundo, pero se logra el objetivo :)

Básicamente lo que pretendo hacer es mandar un post desde un dominio a otro dominio y tomar el resultado que por razones obvias es HTML y analizarlo para extraer ciertos datos que me interesan.

Este es el código que corresponde a la parte del cURL, no es gran cosas y ademas lo copie del manual de PHP

    // INICIALIZAR LA PÁGINA QUE ESPERA EL POST
    $ch = curl_init('http://servidor/pagina.html');
 
    // INDICARLE QUE SE LE ENVIARA UN POST DE LOS NORMALITOS
    curl_setopt ($ch, CURLOPT_POST, 1);
 
    // CON ESTO SE INDICA QUE EL RESULTADO LO GUARDARA EN UNA VARIABLE
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
 
    // EN MI CASO NECESITABA ENVIAR LA COOKIE Y CON ESTA
    // OPCION SE LOGRA TAL COMETIDO
    $cookie="cadenotaQueRepresentaLaCookie";
 
    // ANEXAR LA COOKIE
    curl_setopt($ch, CURLOPT_COOKIE, $cookie);
 
    // MANDARLE LOS VALORES QUE ESTA ESPERANDO LA PAGINA
    curl_setopt ($ch, CURLOPT_POSTFIELDS, 'campo1=valor1&amp;campo2=valor2');
 
    // YA TODO PREPARADO EJECUTAMOS LA ACCION Y LA GUARDAMOS EN LA VARIABLE  EL RESULTADO
    $resultado = curl_exec ($ch);
 
    // CERRAMOS
    curl_close ($ch);
 
    /*FIN */

Y bien con estas simples sencillas líneas podemos enviar POST a otros dominios y analizar las respuestas.

Si quieren conocer mas pueden entrar al manual o esperarse que me haga un experto en el uso de esta librería xD

Espero sea de utilidad para alguien.

Saludos

Presentación de la plática en la UR

Bueno aquí la presentación de la plática que mencione en un post pasado

cualquier duda pueden preguntar, igual y mas adelante subo los ejemplos prácticos que utilizamos para demostrar las vulnerabilidades.

Saludos

Ricardito y yo :)

Hace mucho que no pongo una entrada personal, así que aprovechando que estoy probando la actualización del wordpress aquí hay algunas fotos de Ricardo y yo

Plática en la UR

El sábado pasado se llevo acabo el flisol 2011 y gracias a Basicilio tuve la oportunidad de dar una plática en conjunto con Jesús Reyna el tema del que hablamos fue:

Seguridad en el Desarrollo de Aplicaciones Web PHP

Aunque el que tema es muy muy amplio la plática fue muy general, basicamente se vio la seguridad en el ambiente hablando de LAMP y sobre las mejores prácticas en cuanto a configuración del Sistema Operativo, Apache y PHP.

También tuvimos oportunidad de hacer unos ejemplos prácticos en cuanto programación insegura con el fin de concientizar sobre las consecuencias de hacer código sin preocuparse por este tema es que tan importante.

La audiencia fue buena y hubo algunas preguntas muy interesantes sobre el tema.

Espero participar el próximo año con otra plática o algún taller.

Mas adelante subiré la presentación así como los ejemplos que pusimos (espero no tardarme en postearlos :P )

Aquí unas fotos que me paso mi sobrino Edgar ya que de casualidad andaba también en el evento como buen geek.