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.
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.
- Descargar CVSspam
- Cópialo/súbelo al directo /cvs
- Descomprímelo: tar -zxvf cvsspam-0.2.12.tar.gz
- Renómbralo: mv cvsspam-0.2.12 cvsspam
- Entra en CVSROOT
- Cambiar los atributos del fichero commitinfo Para poder editarlo y realizar cambios sobre él.
- chmod 777 commitinfo
- pico commitinfo
- Añadir la línea: ALL /usr/bin/ruby /cvs/cvsspam/record_lastdir.rb. Utiliza copy&paste.
- Restaurar los atributos del fichero
- chmod 444 commitinfo
- Cambiar los atributos del fichero loginfo.
- chmod 777 loginfo
- pico loginfo
- Añadir la siguiente línea: ALL /usr/bin/ruby /cvs/cvsspam/collect_diffs.rb --to me@mydomain.com %{sVv}. Colocar en vez de me@mydomain.com ,el destinatario principal (normalmente el jefe del proyecto)
- chmod 444 loginfo
- Crear un directorio en /etc llamado cvsspam
- Mover el fichero de configuración: cvsspam.conf al nuevo directorio cvs/cvsspam
- mv /cvs/cvsspam/cvsspam.conf /etc/cvsspam
- Sólo en Modwest. Revisar el fichero cvsspam.rb para quitar la opción –oi. Debe quedar así: cmd = "#{$sendmail_prog} -t".
- Para añadir los destinatarios, editar el fichero /etc/cvsspam/cvsspam.conf. Añadir los destinatario en la sección # Who should be mailed?.
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) && $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