Para los interesados, Luis Abreu publicó unos cuantos videos básicos sobre la utilización de Atlas, también está disponible el código fuente de los ejemplos mostrados en éstos.
Continue readingClient does not support authentication protocol requested by server
Siempre que hago una nueva instalación de MySQL, y entro por phpMyAdmin para administrar mi base de datos me encuentro con el siguiente error:
#1251 - Client does not support authentication protocol requested by server; consider upgrading MySQL client
Esto sucede porque a partir de la versión 4.1.1 MySQL usa un protocolo de autenticación basada en un algoritmo de encriptación de passwords y ya no se puede entrar como estabamos acostumbrados los usuarios antiguos.
Podemos solucionar este problema fácilmente con los siguiente pasos (Para el ejemplo estoy usando MySQL 4.1.12a-nt y Windows XP con Service Pack 2):
-
Entramos por consola a la carpeta de MySQL y escribimos:
mysql -u root -p, donde root es el usuario principal de MySQL nos pedirá que ingresemos la contraseña, en mi caso es 'mysql'. Ahora vamos a "actualizar" la contraseña de root, para eso escribimos:
SQL:dondeSET PASSWORD FOR 'root'@'localhost' = OLD_PASSWORD('mysql');rootes el usuario con el cual quiero usar la antigua forma de autenticación,localhostes el nombre de mi servidor de base de datos y 'pass' es la contraseña que quiero usar (Si tenemos mas usuarios, debemos hacer lo mismo por cada usuario; es decir si tuviera algun usuario llamado 'valois' tendría que escribirSET PASSWORD FOR 'valois'@'localhost' = OLD_PASSWORD('PasswordDeValois');y lo mismo para otros usuarios).
- Listo
Eso es todo, despues de eso podremos entrar sin problemas a administrar nuestra base de datos; sea por consola, phpMyAdmin o cualquier herramienta, cualquier duda ya saben donde molestarme.
Como salir de beta al estilo Microsoft, WTF!
Comentábamos con Alex como Microsoft terminaba la fase beta de Windows Custom Domains y al cargar la página gracias a mi conexión lenta vi unas letras rojitas que decían "Beta", las cuales desaparecieron misteriosamente después, mi curiosidad me llevó a ver el código fuente y encontré esto:

Si asi de fácil terminan las betas, estamos seguros que pronto también estará listo IE7
.
Internet Explorer 7 Beta 3
Acaba de salir una beta más de Internet Explorer, esta vez trae algunas novedades entre ellas: nuevos íconos, posibilidad de ordenar las pestañas, autentificación FTP y otras mas.
Stefano Demiliani ha bautizado a esta última beta como IE-Zilla, pero creo que eso todos ya lo sabíamos
, supongo que cuando salga la versión final yo ya me habré jubilado. Si quieres probarlo te dejo los enlaces:
Recursos de fin de semana
Les dejo algunos enlaces interesantes para poder leer este fin de semana:
- HTML vs XHTML.
- Zoom Zoom Zoom, haciendo zoom al texto usando CSS y JavaScript.
- Esquinas redondeadas con CSS.
- This Style!. Plugin de WordPress que permite insertar CSS personalizado para cada post.
- ¿Tus gráficos dicen cosas equivocadas?
- Tabifier. Una utilidad que identa código HTML y CSS al instante.
- 50 Maneras de convertirse en un buen diseñador.
Visual Studio .NET Tips and Tricks – Desgarga gratuita
PHPMailer con GMail
En un hilo publicado en forosdelweb, en el que un usuario desea utilizar el servidor SMTP de GMail para enviar correos usando PHPMailer, hacen referencia a esta interesante entrada que sirve justamente para lo antes mencionado.
Hice algunos cambios en class.phpmailer.php (línea 537) para separar correctamente el host y el puerto cuando se tienen cosas como $mail->Host = 'ssl://smtp.gmail.com:465';, estos cambios se hicieron debido a que GMail usa SSL/TLS como protocolo de comunicación/autenticación.
if (preg_match('#(([a-z]+://)?[^:]+):(\d+)#i', $hosts[$index], $match))
{
$host = $match[1];
$port = $match[3];
}
else
{
$host = $hosts[$index];
$port = $this->Port;
}
Página de prueba:
require_once 'class.phpmailer.php';
$mail = new PHPMailer ();
$mail -> From = "foo@gmail.com";
$mail -> FromName = "Foo";
$mail -> AddAddress ("bar@domain.com");
$mail -> Subject = "Test";
$mail -> Body = "<h3>From GMail!</h3>";
$mail -> IsHTML (true);
$mail->IsSMTP();
$mail->Host = 'ssl://smtp.gmail.com';
$mail->Port = 465;
$mail->SMTPAuth = true;
$mail->Username = 'foo@gmail.com';
$mail->Password = '******';
if(!$mail->Send()) {
echo 'Error: ' . $mail->ErrorInfo;
}
else {
{ echo 'Mail enviado!'.
}
?>
Nota: Para hacerlo funcionar es necesario que la extensión OpenSSL esté habilitada.
Archivos relacionados
Código fuente externo y Visual Studio .NET
Ohad Israeli comenta un problema de seguridad reportado en enero de este año. Este problema existe cuando Visual Studio ejecuta el código que está dentro del evento Load de un control de usuario o formulario, que a su vez forma parte de algún otro contenedor (también ocurre cuando se heredan controles/formularios)
Si bien es cierto que antes ya había experimentado este comportamiento -como seguramente varios de ustedes-, no lo había visto desde este punto de vista. Tendré que tener un poco más de cuidado para la próxima!
FillSchema y tablas temporales.
Hoy, mientras hacía pruebas en una aplicación desarrollada en C#, una rutina que se encargaba de obtener el esquema de procedimientos almacenados (Sql Server), mandaba errores -con el mensaje "Invalid object name '#temp...'"- por el hecho de que algunos de éstos hacían uso de tablas temporales.
El código en cuestión hacía algo como esto:
Y el procedimiento tenía una estructura parecida a:
AS
SELECT a, b
INT0 #temp
FR0M tabla1
SELECT T.*, T2.c
FR0M #temp T join tabla2 T2
0N T.a = T2.a
go
Después de hacer una búsqueda y encontrar un par de páginas que aclararon mis dudas, finalmente tuve que modificar algunos procedimientos para que hagan uso de variables tipo table.
Nota: La sintáxis del procedimiento tiene errores intencionales debido a los problemas de configuración en el servidor donde se hospeda esta página
Script#
Script#, al igual que Google Web Toolkit, permite generar código javascript, utilizando en este caso cualquier lenguaje compatible con el .NET Framework.
using System;
using ScriptFX;
using ScriptFX.UI;
namespace HelloWorld {
public class Demo : IScriptlet {
private Button _okButton;
private XMLHttpRequest _request;
public void Start() {
_okButton = new Button(Document.GetElementById("okButton"));
_okButton.Click += new EventHandler(this.OnOKButtonClick);
}
private void OnOKButtonClick(object sender, EventArgs e) {
Callback completedCallback = new Callback(this.OnRequestComplete);
_request = new XMLHttpRequest();
_request.Onreadystatechange = Delegate.Unwrap(completedCallback);
_request.Open("GET", "Hello.ashx", true);
_request.Send(null);
}
private void OnRequestComplete() {
if (_request.ReadyState == 4) {
_request.Onreadystatechange = Function.Empty;
Window.Alert(_request.ResponseText);
}
}
}
}
En la página de demostración, lo único que se tiene que hacer es registrar la clase "HelloWorld.Demo".
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Demo Script#</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<input type="button" id="okButton"
value="OK" />
</div>
<nStuff:Scriptlet runat="server"
ScriptAssembly="HelloWorld"
ScriptletType="HelloWorld.Demo" />
</form>
</body>
</html>
// Handler.ashx: Se encarga de procesar la petición.
using System;
using System.Web;
public class HelloHandler : IHttpHandler {
public bool IsReusable {
get {
return true;
}
}
public void ProcessRequest(HttpContext context) {
HttpRequest request = context.Request;
HttpResponse response = context.Response;
string greeting = String.Empty;
string name = request["name"];
if (!String.IsNullOrEmpty(name))
{
greeting = "Hello " + HttpUtility.HtmlEncode(name) + "!";
}
else
greeting = "Hello from server";
greeting += " - Server time: " + DateTime.Now.ToShortTimeString();
response.ContentType = "text/plain";
response.Write(greeting);
}
}
<?xml version="1.0"?>
<configuration>
<system.web>
<pages>
<controls>
<add tagPrefix="nStuff" assembly="nStuff.ScriptSharp.Web" namespace="nStuff.ScriptSharp" />
</controls>
</pages>
</system.web>
</configuration>
Pueden descargar el compilador de Script# desde http://www.nikhilk.net/Content/Samples/ScriptSharp.zip o ver un video demostrativo en http://www.nikhilk.net/Content/Video/ScriptSharpIntro.wmv