sábado 21 de mayo de 2011

Para quienes tengan que instalar Centos en Virtual PC 2007 de Microsoft. Hay al menos 3 ítemes que deberán solucionar para que el sistema ande bien. Acá las 3 soluciones para esos ítemes y asi puedan correr su instalación de Linux Centos relajadamente y sin problemas. Los problemas solucionados en este post son, gráficos de instalación, mouse no habilitado y teclas ESC y TAB.

Problema 1: Falta de Visualización gráfica al instalar. Este problema se da porque el instalador reconoce la tarjeta gráfica de ustedes, pero Virtual PC 2007, al menos en Windows 7, no permite que el Anaconda tome el control correcto de la tarjeta, entonces aparecerán pantallas con el instalador distorsionado.  Algo parecido a la imagen a continuación
grafica_instalacion_centos_virtualpc2007

Dado que en esa pantalla no logran hacer nada, deben reiniciar la máquina virtual y en la línea donde dice "boot:" en vez de presionar directamente enter, escriban lo siguiente:
linux vesa=1024×768 depth=16
ahi pueden aplicar 800x600 o la configuración inicial que deseen. Luego postearé el arreglo completo para el xorg.conf para que la seteen a su antojo. Esto es solo para la instalación. De hecho, la solución del Mouse también la pueden aplicar acá aunque es entretenido instalar sin mouse también. Ahi vean ustedes.
Con eso, entonces, aparecerá nuestra siempre útil pantalla de instalación de Linux y podrán continuar:











Problema 2: Mouse no funciona.
Una vez que instalaron (o en el mismo proceso previo a la instalación) pueden realizar la corrección del mouse, puesto que tampoco tomará el mouse de manera automática nuestro "amigo" Virtual PC.
Para realizar dicha corrección, deben agregar la siguiente frase en su proceso de instalación o en el grub.conf ubicado en /boot/grub/.

i8042.noloop psmouse.proto=imps

Si lo añaden a lo agregado en el paso del problema 1, entonces tendrán instalación gráfica y con mouse, en caso que lo hagan 
posterior a la instalación, deben editar grub.conf con su editor favorito y agregarlo al final de la línea de booteo:
En tal caso queda de la siguiente manera:


grub.conf


Problema 3: Corrección de Teclas ESC y TAB.
Una vez que ingresen a su linux Centos ya instalado, verán que en el terminal no tienen ESC (en vi, por ejemplo) y no tienen nuestro gran amigo 
TAB para el ahorro de tipeo en comandos.
Bueno, ello es, nuevamente, debido a un tema de mala configuración inicial o "seguridad" como dicen en Redmond Company.
Para corregir dicho ítem deben agregar la siguiente política de seguridad:

Abrir "Administrative Tools". Luego click en "Local Security Policy". Ahi deben agregar una nueva regla "New PAth Rule", pues la regla va a un archivo
de Virtual PC. La ruta es : %appdata%\microsoft\virtualpc\vpckeyboard.dll, aunque puede variar según alguna instalación personalizada.
Una vez puesto el path o ruta, entonces denle la categoría de "UNRESTRICTED" a dicho archivo. Luego, apaguen Centos si lo tienen encendido y 
cierren Virtual PC, para luego volver a iniciar y....voilá! Tenemos de vuelta a nuestros amigos ESC y TAB.

Tal como les comenté, luego pueden recorregir su archivo xorg.conf para que el arreglo sea "final" y no tengan más problemas con el sistema y
puedan disfrutar comodamente de su Centos o versión de Linux preferida o necesaria.
Extracto de /etc/X11/xorg.conf

Section "Device"
  Identifier  "Videocard0"
  Driver      "vesa"
  BoardName   "VESA driver (generic)"
  VideoRam    8192
EndSection
Section "Monitor"
  Identifier   "Monitor0"
  ModelName    "Generic Laptop Display Panel 1400x1050"
  VertRefresh  59.0 - 75.0
  HorizSync    31.5 - 90.0
  Option     "dpms"
EndSection
Section "Screen"
  Identifier "Screen0"
  Device     "Videocard0"
  Monitor    "Monitor0"
  DefaultDepth     16
  SubSection "Display"
    Depth     16
    Modes    "1024x768" "800x600" "640x480"
  EndSubSection
EndSection


Logicamente, de acuerdo a su monitor y tarjeta, pueden poner resoluciones mayores a 1024x768, pero en mi caso era lo que necesitaba.
A disfrutar su distro!
Leer más...

miércoles 5 de enero de 2011

Impresión Sin Diálogo de Confirmación

Muchas veces es necesario imprimir directamente en una impresora al finalizar algún proceso o un paso específico en un sistema. Para ello, existe un método en Javascript que permite hacerlo, en conjunto con alguna configuración de seguridad del navegador.
El código está probado en IE >= 5, aunque en 7, al parecer tiene un pequeño cambio. El código está basado en el método ExecWB, el cual es una función del COM Web Browser Control de IE.
Se puede encontrar la documentación completa de ese ítem en http://msdn.microsoft.com/en-us/library/aa752087%28VS.85%29.aspx.


Código HTML:
<object ID="ObjetoImpresionAutomatica" WIDTH=0 HEIGHT=0 CLASSID="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2"></object>
<!-- Este objeto permite la impresión directamente, sin el diálogo de confirmación o impresión automática  -->
<!-- Lo ideal es introducir este objeto en la cabecera o, al menos, previo al llamado de la impresión -->

JAVASCRIPT:
<script language="javascript">
ObjetoImpresionAutomatica.ExecWB(6,2); // Comando que realiza llamado al menù de impresión de Opción File, utilizando el objeto instanciado anteriormente. En versiones anteriores a 5, utilizar 6,-1
ObjetoImpresionAutomatica.outerHTML = "";
</script>

Ejemplo completo:
<object ID="PrintCommandObject" WIDTH=0 HEIGHT=0 CLASSID="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2"></object>
<html>
<head>
</head>
<body bgcolor="#FFFFFF" text="#000000">
<div align="center">
Mensaje de prueba
</div>
<script language="javascript">
PrintCommandObject.ExecWB(6,2);
PrintCommandObject.outerHTML = "";
</script>
</body>
</html>
Configuración de Seguridad del Navegador
Cuando ejecuten el proceso, dependiendo de la configuración de seguridad de su navegador, deberán permitir activeX no firmados con su permiso de ejecución correspondiente, como muestra la figura para IE:

Para Firefox en about:config deben agregar un nuevo item del tipo boolean con el nombre “print.always_print_silent” y el valor lógico "true". Con eso está ok.
espero que les sirva. Saludos!
Leer más...

jueves 26 de agosto de 2010

Bug en PostfixAdmin con base de datos Mysql. Too many connections

He detectado un mini bug en PostfixAdmin que hace que la plataforma rechace conexiones a la base de datos, debido a que genera una saturación de conexiones al motor, Mysql en este caso. El problema radica principalmente en que las funciones de dicho programa solamente abren las conexiones a la base de datos y no las cierran una vez finalizada la query o la operación correspondiente a la base de datos. Con ello, satura el spool de conexiones del motor, dejándolo inhabilitado para operar.

Read More PostfixAdmin es una herramienta, desarrollada en PHP, que permite administrar casillas de correo electrónico para postfix, con utilidades y aplicaciones bastante interesantes, como el Backup, la generación de cuentas y test de la misma online, etc. Bastante recomendable. De hecho tiene soporte multi base de datos, etc. Para mayor información de la app pueden recurrir al sitio http://postfixadmin.sourceforge.net/ y mirar más características de éste.
Particularmente en esta ocasión comentaré acerca de un problema que se generó al utilizar esta plataforma. El proyecto requería una inyección masiva de cuentas online y para ello se modificó la estructura del programa, aprovechando que es free software, con licencia GNU. Al requerir una inyección masiva y continua de cuentas de correo en el sistema, nos percatamos, gracias al control de errores que creé para la plataforma superior que utilizaba esta herramienta, que la plataforma en un momento dejó de crear cuentas. Al revisar los errores de la plataforma, comprobamos un "Too many connections" en el log. Al revisar en Mysql las conexiones activas, vimos que había superado las 170 mil conexiones y no permitía seguir ingresando más.

mysql> show status like '%onn%';
+------------------------------------+------------+
| Variable_name                     | Value      |
+------------------------------------+------------+
| Aborted_connects                | 14            |
| Connections                          | 171083  |
| Max_used_connections      | 31           |
| Ssl_client_connects            | 0              |
| Ssl_connect_renegotiates | 0              |
| Ssl_finished_connects       | 0              |
| Threads_connected            | 4              |
+------------------------------------+------------+
7 rows in set (0.00 sec)

Lo primero que hice fue aumentar la variable max_connections que estaba en 100 (es un mysql  5.0.77) y la setee en 500, para lo cual usé
SET GLOBAL max_connections=500;
Luego de eso al ver que solamente le di algo más de tiempo antes de caer, revisé el code del postfixadmin que estaba utilizando (create-mailbox.php) y revisé la parte referente a las conexiones a la base y certifiqué que las conexiones que se abrían no eran cerradas correctamente, creando un exceso de conexiones sin utilizar y que quedaban abiertas,  impidiendo el buen funcionamiento del motor.
El programa usa una función llamada db_connect() para realizar la conexión y db_query para realizar las consultas a la base. Dichas funciones están incluídas en el archivo functions.inc.php, cuyos cambios detallo a continuación:
//
// db_query
// Action: Sends a query to the database and returns query result and number of rows
// Call: db_query (string query)
// Optional parameter: $ignore_errors = TRUE, used by upgrade.php
//
function db_query ($query, $ignore_errors = 0)
{
global $CONF;
global $DEBUG_TEXT;
$result = "";
$number_rows = "";
static $link;
$error_text = "";
if ($ignore_errors) $DEBUG_TEXT = "";

if (!is_resource($link)) $link = db_connect ();

if ($CONF['database_type'] == "mysql") $result = @mysql_query ($query, $link)
or $error_text = "
DEBUG INFORMATION:
Invalid query: " . mysql_error($link) . "$DEBUG_TEXT";
if ($CONF['database_type'] == "mysqli") $result = @mysqli_query ($link, $query)
or $error_text = "
DEBUG INFORMATION:
Invalid query: " . mysqli_error($link) . "$DEBUG_TEXT";
if ($CONF['database_type'] == "pgsql")
{
$result = @pg_query ($link, $query)
or $error_text = "
DEBUG INFORMATION:
Invalid query: " . pg_last_error() . "$DEBUG_TEXT";
}
if ($error_text != "" && $ignore_errors == 0) die($error_text);

if ($error_text == "") {
if (preg_match("/^SELECT/i", trim($query)))
{
// if $query was a SELECT statement check the number of rows with [database_type]_num_rows ().
if ($CONF['database_type'] == "mysql") $number_rows = mysql_num_rows ($result);
if ($CONF['database_type'] == "mysqli") $number_rows = mysqli_num_rows ($result);
if ($CONF['database_type'] == "pgsql") $number_rows = pg_num_rows ($result);
}
else
{
// if $query was something else, UPDATE, DELETE or INSERT check the number of rows with
// [database_type]_affected_rows ().
if ($CONF['database_type'] == "mysql") $number_rows = mysql_affected_rows ($link);
if ($CONF['database_type'] == "mysqli") $number_rows = mysqli_affected_rows ($link);
if ($CONF['database_type'] == "pgsql") $number_rows = pg_affected_rows ($result);
}
}

$return = array (
"result" => $result,
"rows" => $number_rows,
"error" => $error_text
);
if ($CONF['database_type'] == "mysql") mysql_close($link); //  <---- LINEA AGREGADA
if ($CONF['database_type'] == "mysqli") mysqli_close($link); // <--- LINEA AGREGADA
return $return;
}

Además dado que no solo db_query abría conexiones, se tuvo que modificar también la funcion escape_string.

/**
* Clean a string, escaping any meta characters that could be
* used to disrupt an SQL string. i.e. "'" => "\'" etc.
*
* @param String (or Array)
* @return String (or Array) of cleaned data, suitable for use within an SQL
*    statement.
*/
function escape_string ($string)
{
global $CONF;
// if the string is actually an array, do a recursive cleaning.
// Note, the array keys are not cleaned.
if(is_array($string)) {
$clean = array();
foreach(array_keys($string) as $row) {
$clean[$row] = escape_string($string[$row]);
}
return $clean;
}
if (get_magic_quotes_gpc ())
{
$string = stripslashes($string);
}
if (!is_numeric($string))
{
$link = db_connect();
if ($CONF['database_type'] == "mysql")
{
$escaped_string = mysql_real_escape_string($string, $link);
}
if ($CONF['database_type'] == "mysqli")
{
$escaped_string = mysqli_real_escape_string($link, $string);
}
if ($CONF['database_type'] == "pgsql")
{
// php 5.2+ allows for $link to be specified.
if (version_compare(phpversion(), "5.2.0", ">="))
{
$escaped_string = pg_escape_string($link, $string);
}
else
{
$escaped_string = pg_escape_string($string);
}
}
if ($CONF['database_type'] == "mysql") mysql_close($link); //  <---- LINEA AGREGADA
if ($CONF['database_type'] == "mysqli") mysqli_close($link); // <--- LINEA AGREGADA
}
else
{
$escaped_string = $string;
}
return $escaped_string;
}

Con ello se solucionó el problema y ya no tengo caídas en la base por saturación de conexiones. Cabe destacar que la modificación se realizó solo para mysql y mysqli, pero si se quiere agregar para PostgreSQL solo se debe añadir el close de pg en las partes comentadas. Si alguien más tuvo este problema, ahora tiene la solución...ganancias del software libre, no?

Leer más...

jueves 5 de agosto de 2010

Google Cierra Wave...Cronica de una Muerte Anunciada?

En información publicada en el blog de Google, se señala que, aun cuando había sido presentada con bombos y platillos (de hecho linkee la presentación en mi blog unos cuantos artículos atrás) y aun teniendo unas aplicaciones tremendas en cuanto a experiencia de usuario, IMHO, cerrará las cuentas y el proyecto de Google Wave. Esto debido a que, si bien varios teníamos cuenta y, personalmente, regalé bastantes invitaciones, el sistema no tuvo la aceptación que se esperaba en la gente. Particularmente creo que las redes sociales tienen mucho que ver en el tema, en cuanto, si bien no tienen la misma experiencia que tenía Wave, tienen aplicaciones con un final bastante parecido pero usando una vía distinta.

De hecho, en Facebook, donde no tengo cuenta ni tendré, puedes "compartir" fotografías. Insisto, no en la manera que lo hacía Wave, pero con el mismo efecto final. El drag and drop de Wave no ha sido replicado aun en ninguna red social, pero la gente normalmente lo ve como una ganancia secundaria o de menor importancia. El tema de ver lo que el otro escribía, en línea, si bien es un chiche, la finalidad de ello es que el mensaje completo le llegue al destinatario, lo cual lo tienen en modalidad chat las páginas de ese estilo.Y asi, el resto de las apps de Wave.
Personalmente creo que Wave era un buen producto, pero careció de difusión, por un lado. Por otro lado, y aqui es donde creo que falló la visión y la ambición superó la realidad, Wave estaba diseñado para ser un protocolo, en realidad, era o es un protocolo de comunicación. De hecho la idea era que otras empresas crearan sus clientes para ese protocolo. Ese protocolo tenía la finalidad de reemplazar el IMAP, POP3 y demases protocolos de correo electrónico. Ahi es donde estuvo el error. Inicialmente debieron buscar la manera de integrarse a esos protocolos, en vez de desbancarlos, puesto que éstos llevan bastante tiempo con nosotros y serán muy difíciles de erradicar, por no decir casi imposible, a menos que alguna revolución tecnológica nos encamine a otro lado.
Pero como siempre, Google no pierde todo lo que hace y en el mismo artículo del blog de Google se recuerda que el código de varias aplicaciones es código abierto, por lo que cualquier otro individuo podrá añadirlo a sus aplicaciones. Además Google lo integrará con Gmail y en otras apps propias de ellos.
Leer más...

sábado 5 de junio de 2010

Problema con Libreria php_pgsql en php 5.2.13

Instalando php 5.2 en un servidor (no se podia instalar 5.3 por la "vejez" del código existente), resultó que no cargaba la librería para conectar con PostgreSql. La version instalada en ese momento era la 5.2.13. El error que mostraba era el clasico "unable to load dynamic library". El tamaño de la librería php_pgsql en php 5.2.13 es de aproximadamente 95 KB y esa es la que presenta problemas para cargar. La solución, al menos la que se obtuvo para este caso, fue realizar el downgrade de la libreria a la que aparece en la version de Php 5.2.5, la cual, en tamaño, dobla a su sucesora, con cerca de 135 KB. Se copia esa librería en la carpeta /PHP/ext o su correspondiente para tu sistema y listo. Solo reinicias el servidor web de tu uso y listo.
Revisando php.net para la explicación de esta situación, encontré que la razón se debía a que la libreríaphp_pgsql.dll suministrada desde 2.5.6 en adelante está dinámicamente linkeada con libpq.dll, a diferencia de la 5.2.5 donde estaba estáticamente linkeada y no tenía esa dependencia. Leer más...

lunes 31 de mayo de 2010

FastCgi Error 1413

En una asesoría realizada hace poco, detecté un error que tenía una instalación de PHP con FastCgi para IIS V6.0.
Al parecer el MSI de php 5.3.2 no creó bien las entradas en el archivo de configuración fcgiext.ini en c:\windows\system32\inetsvr.
El error que lanzaba en pantalla el navegador era el siguiente:

FastCGI Error
The FastCGI Handler was unable to process the request.
--------------------------------------------------------------------------------
Error Details:
Could not find entry for "php" on site 1 in [Types] section.
Error Number: 1413 (0x80070585).
Error Description: Invalid index.
HTTP Error 500 - Server Error.
Internet Information Services (IIS)

Para solucionar ese error hay que verificar que el archivo fcgiext.ini mencionado anteriormente tenga las entradas correctas para PHP.
Las entradas que yo puse para ese servidor y que funcionaron, fueron las siguientes:
En la línea final del archivo aparecía
-------------
[Types]
-------------
hay que agregar las siguientes líneas para que quede asi:
-----------------------
[Types]
php=PHP

[PHP]
ExePath=UNIDAD:\RUTA AL PHP\php-cgi.exe      --->(Ej     C:\PHP, H:\CARPETA1\PHP)
InstanceMaxRequests=10000
ActivityTimeout=600
RequestTimeout=600
EnvironmentVars=PHP_FCGI_MAX_REQUESTS:10000,PHPRC:UNIDAD:\RUTA AL PHP\     -------->(Ej: C:\PHP\)

----------------------------------------

Obviamente los parámetros InstanceMaxRequests, ActivityTimeout y RequestTimeout pueden ser modificados a su libre albedrío.
Las EnvironmentVars tienen que quedar con los parametros de su sistema. Recuerden reemplazar las palabras UNIDAD y RUTA AL PHP por sus datos. Leer más...

viernes 14 de mayo de 2010

FUDCon Latam 2010, en Chile

Desde el 15 al 17 de julio se realizara en nuestro pais el FUDCon (Fedora Users and Developers Conference) para Latinoamerica. En esta ocasion, la sede para el evento sera la Universidad Central, patrocinada por su comunidad Linux Ucentux.
Se espera contar con la presencia de bastantes adeptos al sistema Linux, en especial a su distribucion Fedora. Se esperan variadas charlas respecto al SO, entre las que destacan la de Gnome 3.0 e Infraestructura de LATAM, entre otras que se iran confirmando. Puedes ver con mayor detalle consejos, ubicaciones, avisos, alojamientos y transporte en la pagina de FedoraProject  disponible para este evento. Si quieres colaborar, en la misma tambien puedes encontrar la informacion para hacerlo.
Leer más...