Búsqueda


Categorías

C# [15]
PHP [6]
Zend [1]
FileMaker [1]
.NET [6]
CVS [3]
General [9]
Javascript [2]
Paypal [1]
.NET Compact Framework [3]
C++ [1]
mysql [4]
Linux [1]

Últimos post

Dónde guardar los archivos de configuración en ClickOnce
phpinfo: Valores en error_reporting
Notes about Zend Server and Zend Studio setup
What's new in C# 4
Resolving a 'sticky tag is not a branch' error
Resumen del CodeCamp
CodeCamp Tarragona 2009
Acerca de la calidad del código
ClickOnce en Linux
Programando en PHP (y con CVS) en Visual Studio 2008

Sindicación

RSS 0.90
RSS 1.0
RSS 2.0
Atom 0.3

Ordenar con MySQL

ctg | 04 Mayo, 2007 22:50

Hoy, realizando un trabajo en MySQL me he encontrado con un problema. El objetivo era ordenar un simple campo de texto. La cuestión estaba en el contenido de los campos. La tabla contenía los datos sobre dioptrías con los siguientes valores: -10.00, -9.50…0.00, +0.50, -+1.00, etc. Únicamente se desea ordenar las dioptrías de mayor a menor. Cuando he visto los valores, he recordado que ORDER BY no funcionaba como se cree.

Para ordenar este tipo de valores, es necesario utilizas CAST…AS SIGNED

SELECT * FROM `table` ORDER BY `fieldname` CAST AS SIGNED ASC

Publicado en mysql . Comentario: (0). Retroenlaces:(0). Enlace

Companion Sharing option in FileMaker

ctg | 19 Marzo, 2007 15:16

When you are developing in C# and you try to do a query into FileMaker and get a similar exception like this: ERROR [42S02] [FileMaker][ODBC FileMaker Pro driver][FileMaker Pro]Invalid database name.\r\nERROR [42S02] [FileMaker][ODBC FileMaker Pro driver]Cannot open table: XXXXXXXXXX .FP5"} and you are 100% sure that database are open, you must be check a internal option in FileMaker. Open the problematic database and go to File Menu and select Sharing option. Into Companion Sharing, check Local Data Access Companion is enabled.

 FileMaker table

Publicado en FileMaker . Comentario: (0). Retroenlaces:(0). Enlace

Diferencias entre fechas con PHP

ctg | 16 Febrero, 2007 00:08

Clase simple, en PHP, para calcular diferencias entre fechas.

<?php
// Class for get the differences in seconds, min, hours, days and weeks between two dates
// Notes: If you only need the difference in days, assure that seconds, min and hours are 0
class TimeSpan
{
     var $diff_seconds;
     var $diff_minutes;
     var $diff_hours;
     var $diff_days;
     var $diff_weeks;
          
     // Date format: YYYYMMDDHHmmSS
     function TimeSpan($date1, $date2)
     {
          // Transform to Unix timestamp
          $epoch_1 = mktime( substr($date1,8,2), substr($date1,10, 2), substr($date1,12, 2), substr($date1,4, 2), substr($date1,6, 2), substr($date1,0, 4) );
          $epoch_2 = mktime( substr($date2,8,2), substr($date2,10, 2), substr($date2,12, 2), substr($date2,4, 2), substr($date2,6, 2), substr($date2,0, 4) );
     
          $this->diff_seconds = $epoch_1 - $epoch_2;
          $this->diff_minutes = floor($this->diff_seconds/60);
          $this->diff_hours   = floor($this->diff_seconds/3600);
          $this->diff_days     = floor($this->diff_seconds/(3600*24));
          $this->diff_weeks   = floor($this->diff_seconds/(3600*24*7));
     }

     // Gets the seconds
     function getDiffSeconds()
     {
          return $this->diff_seconds;
     }
     
     // Gets the minutes
     function getDiffMinutes()
     {
          return $this->diff_minutes;
     }
     
     // Gets the hours
     function getDiffHours()
     {
          return $this->diff_hours;
     }
     
     // Gets the days
     function getDiffDays()
     {
          return $this->diff_days;
     }
     
     // Gets the weeks
     function getDiffWeeks()
     {
          return $this->diff_weeks;
     }
}

?>

Publicado en PHP . Comentario: (0). Retroenlaces:(0). Enlace

Remove “My shared documents” folder

ctg | 11 Enero, 2007 00:07

I hate stupid folders. I never use this folder but till now, I don’t know how remove it. Today, I found the solution in a post

For remove this folder, launch regedit and go to HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\
CurrentVersion\Explorer\MyComputer\NameSpace\DelegateFolders. Inside DelegateFolders you can find another folder with name {59031a47-3f72-44a7-89c5-5595fe6b30ee}. Destroy it and reboot.

Publicado en General . Comentario: (0). Retroenlaces:(0). Enlace

Five common PHP design patterns

ctg | 12 Septiembre, 2006 15:21

I found a good article related with the patterns using PHP.

In Five common PHP design patterns, you can find the implementation of next patterns: factory, singleton, observer, chain-of-command and strategy patterns.

Maybe in the future, I would use these patterns in Roci. Actually is difficult implements these patterns for two main reasons: we use PHP4 and merge all this stuff into JShop will be a tremedous headache

Publicado en PHP . Comentario: (0). Retroenlaces:(0). Enlace

Convert HTML into text

ctg | 16 Agosto, 2006 15:01

I put this code here (for future review). It’s a simple code for convert HTML into text (or remove HTML tags) 

<?php
// $document should contain an HTML document.
// This will remove HTML tags, javascript sections
// and white space. It will also convert some
// common HTML entities to their text equivalent.
$search = array ("'<script[^>]*?>.*?</script>'si",
// Strip out javascript "'<[/!]*?[^<>]*?>'si", // Strip out HTML tags
"'([rn])[s]+'", // Strip out white space
"'&(quot|#34);'i",// Replace HTML entities
"'&(amp|#38);'i", "'&(lt|#60);'i", "'&(gt|#62);'i", "'&(nbsp|#160);'i", "'&(iexcl|#161);'i", "'&(cent|#162);'i", "'&(pound|#163);'i", "'&(copy|#169);'i", "'&#(d+);'e"); // evaluate as php
$replace = array ("", "", "\1", "\"", "&", "<", ">", " ", chr(161), chr(162), chr(163), chr(169), "chr(\1)");
$text = preg_replace($search, $replace, $document);
?>
 

Publicado en PHP . Comentario: (0). Retroenlaces:(0). Enlace

Send a file to the recycle bin in C#

ctg | 26 Mayo, 2006 00:02

using System;
using System.IO;
using System.Runtime.InteropServices;

/// <summary>
/// Class to delete a file and move it to Recycle bin
/// </summary>
class RecycleBin
{
     private const int FO_DELETE          = 3;
     private const int FOF_ALLOWUNDO      = 0x40;
     private const int FOF_NOCONFIRMATION = 0x0010;
   
     [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto, Pack=1)]
     public struct SHFILEOPSTRUCT
     {
          public IntPtr hwnd;
          [MarshalAs(UnmanagedType.U4)] public int wFunc;
          public string pFrom;
          public string pTo;
          public short fFlags;
          [MarshalAs(UnmanagedType.Bool)] public bool fAnyOperationsAborted;
          public IntPtr hNameMappings;
          public string lpszProgressTitle;
     }
     [DllImport("shell32.dll", CharSet=CharSet.Auto)]
     static extern int SHFileOperation(ref SHFILEOPSTRUCT FileOp);
     /// <summary>
     /// Delete a file and move it to Recycle bin
     /// </summary>
     /// <param name="fileName">File to delete</param>
     public static void Send(string fileName)
     {
          if (File.Exists(fileName) )
          {
               SHFILEOPSTRUCT shf = new SHFILEOPSTRUCT();
               shf.hwnd = IntPtr.Zero;
               shf.wFunc = (int) FO_DELETE;
               shf.pTo = null;
               shf.pFrom = fileName + "\0\0";
               shf.fFlags = (ushort) FOF_ALLOWUNDO | FOF_NOCONFIRMATION;
               shf.fAnyOperationsAborted = false;
               shf.hNameMappings = IntPtr.Zero;
               SHFileOperation(ref shf);
          }
     }
}
 

Publicado en C# . Comentario: (0). Retroenlaces:(0). Enlace

Use foreach in hashtable

ctg | 16 Mayo, 2006 00:00

Two ways for use a “foreach” in a Hashtable

foreach (string key in hash.Keys) Response.Write(key + '=' + hash[key] + "<br>");

Or

foreach (DictionaryEntry myDE in hash) Response.Write(myDE.Key + "=" + myDE.Value  + "<br>");

Publicado en C# . Comentario: (0). Retroenlaces:(0). Enlace

Automatizar CVS para enviar emails

ctg | 06 Abril, 2006 23:58

Para enviar un e-mail cada vez que “alguien” haga un add/commit con CVS.

addRecipient "ctello@rocinantesoftware.com"
addRecipient "snr@amexoptics.com"

Publicado en CVS . Comentario: (2). Retroenlaces:(0). Enlace

Problemas con los iconos de TortoiseCVS

ctg | 06 Marzo, 2006 23:34

En ocasiones, y de forma aleatoria, los iconos de TortoiseCSV se visualizan incorrectamente.

Hoy, por culpa de este error, he perdido un poco de tiempo en saber si un fichero estaba o no modificado. Vale… de acuerdo… también se puede utilizar el menú contextual… pero es que tenía un montón de ficheros modificados y el listado era muy grande.

Este problema no es culpa de TortoiseCVS, si no un caché que tiene Windows con los iconos.

Existen varias formas de arreglarlo:

La fácil consiste en ejecutar la opción del menú contextual, CVS y ejecutar Rebuild Icons Comand.

Otra consiste en borrar el un fichero (oculto), en caso de que existiese, llamado ShellIconCache en el directorio de Windows y reiniciar.

La mejor, aunque como en la mayoría de estos casos, es tener que añadir alguna modificación en el registro.

Localiza:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer


Añade una nueva cadena (String Value), llamada Max Cached Icons y coloca el valor 2048. Más información, aquí.

Publicado en CVS . Comentario: (0). Retroenlaces:(0). Enlace

Enviar email con adjuntos

ctg | 22 Febrero, 2006 23:48

Pongo este código aquí para recordar como se envía un PHP un email con uno o varios ficheros adjuntos.

 <?php
function sendmail ($to, $subject, $text_message, $attachment="")
{
$main_boundary = "----=_NextPart_".md5(rand());
$text_boundary = "----=_NextPart_".md5(rand());
$html_boundary = "----=_NextPart_".md5(rand());
$headers="";
$headers .= "MIME-Version: 1.0\n";
$headers .= "Content-Type: multipart/mixed;\n\tboundary=\"$main_boundary\"\n";
$message="";
$message .= "\n--$main_boundary\n";
$message .= "Content-Type: multipart/alternative;\n\tboundary=\"$text_boundary\"\n";
$message .= "\n--$text_boundary\n";
$message .= "Content-Type: text/plain; charset=\"ISO-8859-1\"\n";
$message .= "Content-Transfer-Encoding: 7bit\n\n";
$message .= "\n--$text_boundary\n";
$message .= "Content-Type: multipart/related;\n\tboundary=\"$html_boundary\"\n";
$message .= "\n--$html_boundary\n";
$message .= "Content-Type: text/html; charset=\"ISO-8859-1\"\n";
$message .= "Content-Transfer-Encoding: quoted-printable\n\n";
$message .= str_replace ("=", "=3D", $text_message)."\n";
if (isset ($attachment) &&amp; $attachment != "" && count ($attachment) >= 1)
{
for ($i=0; $i<count ($attachment); $i++)
{
$attfile = $attachment[$i];
$file_name = basename ($attfile);
$fp = fopen ($attfile, "r");
$fcontent = "";
while (!feof ($fp))
{
$fcontent .= fgets ($fp, 1024);
}
$fcontent = chunk_split (base64_encode($fcontent));
@fclose ($fp);
$message .= "\n--$html_boundary\n";
$message .= "Content-Type: application/octetstream\n";
$message .= "Content-Transfer-Encoding: base64\n";
$message .= "Content-Disposition: inline; filename=\"$file_name\"\n";
$message .= "Content-ID: <$file_name>\n\n";
$message .= $fcontent;
}
}
$message .= "\n--$html_boundary--\n";
$message .= "\n--$text_boundary--\n";
$message .= "\n--$main_boundary--\n";

$result = @mail ($to, $subject, $message, $headers);
return $result;
}
?>

Publicado en PHP . Comentario: (0). Retroenlaces:(0). Enlace

INNER JOIN y COUNT

ctg | 22 Febrero, 2006 23:45

De vez en cuando, me toca realizar alguna consulta SQL un poco especial. Para no tener que echar mano al libro de Paul Dubois, MySql, o visitar alguna web dónde pueda “refrescar” mis conocimientos sobre SQL, dejo aquí algunos apuntes que pueden ser útiles.

Ejemplo 1)

Con la siguiente consulta se genera una tabla dónde aparecen todos los campos de la tabla jss_products y también los campos que tengan concordancia en la cláusula ON de la tabla jss_products_tree. Esta consulta se realiza para obtener una tabla con todos los productos (jss_products) y sus id de sección (jss_products_tree)

SELECT * FROM jss_products INNER JOIN jss_products_tree ON jss_products.productid = jss_products_tree.productid

Ejemplo 2)

Las tabla jss_products_tree sólo contiene el Id de la sección y no su nombre. Este nombre se encuentra en la tabla jss_sections. Por lo tanto, para realizar una tabla en la que se encuentre el nombre de la sección, se debe utilizar la siguiente consulta

SELECT * FROM (jss_products INNER JOIN jss_products_tree ON jss_products.productid = jss_products_tree.productid)INNER JOIN jss_sections ON jss_sections.sectionId = jss_products_tree.sectionid

Recordar que INNER JOIN muestra las líneas que contengan al menos un registro de la tabla que hayamos escrito a la derecha.

Para no repetir los campos (y evitar confusiones) en vez de utilizar * para seleccionar todos los campos, colocaremos los nombres de los campos que queremos consultar. La sentencia quedará más larga, pero la tabla mucho más sencilla.

SELECT jss_products.productId, jss_products.code, jss_products.name, jss_products.description, jss_products_tree.sectionId, jss_sections.title FROM (jss_products INNER JOIN jss_products_tree ON jss_products.productid = jss_products_tree.productid)
INNER JOIN jss_sections ON jss_sections.sectionId = jss_products_tree.sectionid

Si queremos saber el id del producto, su id de sección y el nombre de la sección:

SELECT jss_products.productId, jss_sections.sectionid, jss_sections.title FROM
(jss_products INNER JOIN jss_products_tree ON jss_products.productid = jss_products_tree.productid)
INNER JOIN jss_sections ON jss_sections.sectionId = jss_products_tree.sectionid

Y normalmente, en un buscador, se muestra el nombre de la sección y entre paréntesis, el número de artículos. Para conseguir el número de artículos utilizamos el operador COUNT(*). Al utilizar este operador, es necesario también utilizar GROUP BY.

SELECT count(*) as totalfound, jss_sections.sectionid, jss_sections.title FROM (jss_products INNER JOIN jss_products_tree ON jss_products.productid = jss_products_tree.productid)
INNER JOIN jss_sections ON jss_sections.sectionId = jss_products_tree.sectionid group by jss_sections.sectionId

Ejemplo 3)

Se quiere buscar un producto. Queremos que buscar las secciones y el número de productos que tiene esa sección. Por ejemplo, si buscamos la palabra curado, es perfectamente posible que existan varios productos con esta palabra en su nombre. Incluso, estos productos pueden estar en secciones diferentes. Para mostrar los productos, utilizaremos la siguiente sentencia:

SELECT jss_products.productId, jss_products.name, jss_sections.sectionid, jss_sections.titleFROM (jss_products INNER JOIN jss_products_tree ON jss_products.productid = jss_products_tree.productid)INNER JOIN jss_sections ON jss_sections.sectionId = jss_products_tree.sectionidWHERE jss_products.name LIKE "%curado%"

Pero como queremos saber sólo el número de productos que hay dentro de una sección, la sentencia queda un poco diferente

SELECT count( * ) AS totalfound, jss_sections.sectionid, jss_sections.titleFROM (jss_products INNER JOIN jss_products_tree ON jss_products.productid = jss_products_tree.productid)INNER JOIN jss_sections ON jss_sections.sectionId = jss_products_tree.sectionidWHERE jss_products.name LIKE "%curado%"GROUP BY jss_sections.sectionid

Publicado en mysql . Comentario: (0). Retroenlaces:(0). Enlace

Borrar el contenido de un cuadro de texto

ctg | 09 Febrero, 2006 23:04

Pongo aquí estos dos trozoso de código. De este modo, sabré dónde tengo que ir a buscarlo la próxima vez que me haga falta...

<script language="JavaScript">
function clickclear (thisfield)
{
thisfield.value = "";
}
</script>

O prueba este también

<input type="text" name="url" id="url" class="texto" value="www.cristobaltello.com" onfocus="if(this.value=='www.cristobatello.com')this.value=''" />

Publicado en Javascript . Comentario: (0). Retroenlaces:(0). Enlace

Emulator for Windows CE installation is missing

ctg | 17 Enero, 2006 23:22

Pues eso, después de pasarme todo un día entero instalando los programas necesarios para trabajar, resulta que el emulador de Pocket PC no funciona.

La solución … increíble… pero cierto!!!

Problema: Al intentar lanzar el emulador, aparece el siguiente error:

One or more files from the Emulator for Windows CE installation is missing. Please reinstall Emulator for Windows CE and try again.

Resulta que si tienes Windows XP, con el service pack 2 y un AMD 64 (mi ordenador en el trabajo) el emulador no funciona. Esto no lo digo yo, lo dice aquí.

Pues para arreglar el error, solamente tienes que modificar el boot.ini y quitarle la opción /pae y /noexecute

Puedes encontrar más información sobre este error y sobre el Compact Framework, visitando el Open NETCF Wiki

Publicado en .NET Compact Framework . Comentario: (0). Retroenlaces:(0). Enlace

Pensar en C++

ctg | 10 Enero, 2006 23:30

Hace tiempo leí el fantástico libro Thinking in C++ de Bruce Eckel.

Recordaba que se empezó, por parte de una universidad española, la traducción a nuestro querido idioma. Por lo que he podido saber, el proyecto nunca quedo descontinuado, sino más bien que esos universitarios, hoy en día ya trabajan y no lo dedican tanto tiempo. La nueva dirección para poder descargárlo esta aquí. David Villa, sigue siendo el responsable. Si tengo un poco de tiempo, iré ayudando un poco en la traducción, aprovechando que ahora hablo más inglés que nunca.

Publicado en C++ . Comentario: (0). Retroenlaces:(0). Enlace