Codeigniter: Modificar LIMIT para el driver MSSQL

Después de encontrar la solución para que funcione el LIMIT de MySQL en Microsoft SQL Server ahora sigue el turno de modificar el código de Codeigniter para así tener algo transparente para nuestras consultas SQL.

Lo primero que se debe de hacer es modificar la librería de carga del Codeigniter, ( $this->load-> )
Vamos a trabajar en la carpeta: /system/application/libraries/ y creamos un archivo llamado: MY_Loader.php con el siguiente código:

< ?php class MY_Loader extends CI_Loader{ / * Constructor, calls parent constructor. */ function MY_Loader() { parent::CI_Loader(); } / * Database Loader * * @access public * @param string the DB credentials * @param bool whether to return the DB object * @param bool whether to enable active record (this allows us to override the config setting) * @return object */ function database($params = '', $return = FALSE, $active_record = FALSE) { // Do we even need to load the database class? if (class_exists('CI_DB') AND $return == FALSE AND $active_record == FALSE) { return FALSE; } require_once(BASEPATH.'database/DB'.EXT); // Load the DB class $db =& DB($params, $active_record); $my_driver = config_item('subclass_prefix').'DB_'.$db->dbdriver.’_driver’;
$my_driver_file = APPPATH.’libraries/’.$my_driver.EXT;

if (file_exists($my_driver_file))
{
require_once($my_driver_file);
$db =& new $my_driver(get_object_vars($db));
}

if ($return === TRUE)
{
return $db;
}
// Grab the super object
$CI =& get_instance();

// Initialize the db variable. Needed to prevent
// reference errors with some configurations
$CI->db = ”;
$CI->db = $db;
// Assign the DB object to any existing models
$this->_ci_assign_to_models();
}

}

La idea de este archivo es extender la funcionalidad de carga de los drivers para la base de datos, despues en la misma carpeta de libraries creamos un archivo llamado: MY_DB_mssql_driver.php ya que estamos usando el driver mssql para nuestra conexión SQL Server

< ?php class MY_DB_mssql_driver extends CI_DB_mssql_driver { function __construct($params){ parent::__construct($params); log_message('debug', 'Extended DB driver class instantiated!'); } function _limit($sql, $limit, $offset){ if($offset == 0){ return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$limit.' ', $sql); }else{ $OrderBy = "ORDER BY "; if (count($this->ar_orderby) > 0){
$OrderBy .= implode(‘, ‘, $this->ar_orderby);

if ($this->ar_order !== FALSE)
{
$OrderBy .= ($this->ar_order == ‘desc’) ? ‘ DESC’ : ‘ ASC’;
}
}else{
$OrderBy .= “(SELECT 1)”;
}

$sql = preg_replace(‘/(\\’. $OrderBy .’\n?)/i’,”, $sql);
$sql = preg_replace(‘/(^\SELECT (DISTINCT)?)/i’,’\\1 ROW_NUMBER() OVER (‘.$OrderBy.’) AS rownum, ‘, $sql);
return “SELECT * \nFROM (\n” . $sql . “) AS A \nWHERE A.rownum BETWEEN (” .($offset + 1) . “) AND (“.($offset + $limit).”)”;
}
}

Y listo! con esto nuestra consulta LIMIT será transparente y se usará como siempre: $this->db->limit(2,10);

Aca les dejo las fuentes de esta información:

Solución: Error 504 Gateway Timeout – Cherokee PHP

Después de varios problemas con el mentado error 504 Gateway Timeout y algunas soluciones temporales como matar procesos de PHP CGI por fin he dado con la solución (por lo menos lleva semanas sin fallar).

Efectivamente el error es provocado por el interprete de PHP-CGI ya que tenia poco tiempo para procesar la solicitud y pues a veces se quedaba colgado el proceso.

Antes que nada tenemos que verificar que este correctamente configurado el interprete de PHP para FastCGI (PHP_FCGI), entramos al panel de control con el comando cherokee-admin y despues nos dirigimos a Origenes > PHP

Y verificamos que este en conexión: 127.0.0.1:47990 (el puerto pueden ponerle cualquiera que este libre)
Y también en interprete: /usr/bin/php-cgi -b 127.0.0.1:47990

Despues nos vamos a donde se especifica el tiempo máximo para cada respuesta del PHP FCGI, para eso nos pasamos a la consola y como root nos metemos al archivo /etc/cherokee/cherokee.conf

Y agregamos/modificamos el siguiente parámetro: PHP_FCGI_MAX_REQUESTS = 300

source!1!env!PHP_FCGI_CHILDREN = 5
source!1!env!PHP_FCGI_MAX_REQUESTS = 300
source!1!env_inherited = 1
source!1!host = 127.0.0.1:47990
source!1!interpreter = /usr/bin/php-cgi -b 127.0.0.1:47990
source!1!nick = PHP Interpreter
source!1!type = interpreter

Recordemos que si tenemos varios interpretes puede cambiar el parámetro después de source! por algún otro número.

Y listo! reiniciamos cherokee y en teoría no debería de fallar.

Licencia WTFPL para tus proyectos

Si ocupas una licencia para tus proyectos y las existentes se te hacen muy elaboradas como la GPL – General Public License, MIT – Massachusetts Institute of Technology, BSD – Berkeley Software Distribution, o un monto de licencias de Software Libreo peor aún una para código cerrado (como las de Microsoft) mejor usar la licencia WTFPL – Do What The Fuck You Want To Public License

Aquí la traducción en español (traducida por janO)

LICENCIA PÚBLICA de NO SEAS UN CAPULLO

Version 1, Diciembre 2009

Copyright (C) 2009 Philip Sturgeon

Se autoriza la reproducción y distribución de las copias del presente documento de licencia, y se permite así mismo su modificación siempre y cuando se cambie el nombre de la licencia.

LICENCIA PÚBLICA de NO SEAS UN CAPULLO
TÉRMINOS Y CONDICIONES PARA LA COPIA, DISTRIBUCIÓN Y MODIFICACIÓN

1. Haz lo que te dé la gana con el trabajo original, pero no seas un capullo.

Ser un capullo incluye – pero no está limitado a – los siguientes casos:

1a. Infracción total del derecho de copia – No te limites a simplemente copiar el trabajo y cambiarle de nombre.
1b. Vender el trabajo original sin haber aportado absolutamente nada nuevo, eso sí que es ser un VERDADERO capullo.
1c. Modificar el trabajo original para incluirle de manera oculta código malicioso. Eso significaría que eres un capullo INTEGRAL.

2. Si te haces rico con las modificaciones, mediante trabajos o servicios relacionados, o dando soporte del trabajo original, sé generoso y comparte. Sólo un capullo se forraría con este trabajo y no le compraría al autor del trabajo original una buena jarra de cerveza.

3. El código se suministra sin ninguna garantía. Usar el código de otra persona y cagarse cuando algo va mal te hace ser un capullo bastante CORTITO. Arréglalo tú mismo. Sólo alguien que fuera un capullo no enviaría de vuelta la corrección.

Continue reading

Cherokee-PHP: Error 504 Gateway Timeout

Por alguna extraña razón en el servidor web Cherokee, de repente sin motivo aparente empezaron a aparecer errores 504 Gateway Timeout en todas las páginas terminadas con extensión .PHP, las .HTML si se ven correctamente, entonces el error debe de estar en la configuración o proceso de PHP5.

Antes de mover la configuración (porque todo funcionaba bien antes), decidi matar los procesos de PHP,

con el ps -ax revise que existieron procesos de PHP:

2658 ? S 0:07 /usr/bin/php-cgi -b 127.0.0.1:47990
6592 ? Ss 0:06 /usr/sbin/sshd
11296 ? S 0:01 /usr/bin/php-cgi -b 127.0.0.1:47990
14097 ? S 0:17 /usr/bin/php-cgi -b 127.0.0.1:47990

Y bueno, a proceder con la eliminación de los mismos, pero para no irme de proceso en proceso pues elimino todos los que tengan la palabra php y despues reinicio cherokee webserver.

pkill -9 php
/etc/init.d/cherokee restart

Y voalaaa!, ahora ya funcionan bien las páginas!…, solo falta ver, el porque de esta falla para que no vuelva a suceder.

Cherokee: Duped suffix (case insensitive) ‘z’, pointing to ‘package.png’

Despues de actualizar el servidor web Cherokee y querer reiniciar el servicio desde el panel de control, me aparecio el siguiente mensaje de error:

Duped suffix (case insensitive) ‘z’, pointing to ‘package.png’
An unexpected error has just occurred in the server. The cause of the issue is unknown. Please, do not hesitate to report it at http://bugs.cherokee-project.com/ so the developer team can fix it.

La solución es ingresar a la siguiente página: http://127.0.0.1:9090/general#Icons-4 (Ajustes generales > Iconos) y despues buscar en la lista de extensiones el icono de paquetes (esta abajo de musica y arriba de pdf) y eliminar la extensión llamada Z (con mayusculas), ya que existe una llamada z (en minusculas) y en la nueva versión de cherokee ya no es necesario especificar las 2.

Error al montar NTFS, necesita un chkdsk /f

Si tienes problemas para montar un disco duro ó unidad USB formateada con NTFS ya que te dice que necesita reparación del sistema de archivo, porque se apago sin desmontar la unidad y que debemos de utilizar el comando chkdsk /f (que es un comando de Windows), tenemos la solución sin salir de nuestra sistema operativo Linux, en este caso Ubuntu.

El comando que nos ayuda a solucionar este problema de reparación del sistema de archivos se llama ntfsfix, aunque no pretende ser un chkdsk, pero ayuda a reparar algunas inconsistencias del NTFS.

Simplemente como Root lo ejecutamos de esta forma, donde /dev/sdb1 es nuestro disco duro USB.

root@ubuntu:~# ntfsfix /dev/sdb1
Mounting volume… FAILED
Attempting to correct errors…
Processing $MFT and $MFTMirr…
Reading $MFT… OK
Reading $MFTMirr… OK
Comparing $MFTMirr to $MFT… FAILED
Correcting differences in $MFTMirr record 0…OK
Processing of $MFT and $MFTMirr completed successfully.
Setting required flags on partition… OK
Going to empty the journal ($LogFile)… OK
NTFS volume version is 3.1.
NTFS partition /dev/sdb1 was processed successfully.

Despues de esto, solo nos resta montar la unidad,

root@ubuntu:~# mkdir /media/DISCO_MONTADO
root@ubuntu:~# mount -t ntfs-3g /dev/sdb1 /media/DISCO_MONTADO -o force

y listo, para la proxima no hay que olvidar desmontar correctamente la unidad externa.

Resetear la contraseña del usuario Root en MySql

Si por alguna razón se les olvido la contraseña del usuario ROOT en MySQL existe una opción sencilla para cambiarla, el unico requisito es claro tener privilegios de root en su distribución de linux favorita, ya sea ubuntu, debian, centos, etc… en estos ejemplos usaremos Ubuntu (ó Debian debe de jalar igual)

El paso 1 es detener el servidor MySQL,

/etc/init.d/mysql stop

Despues iniciar MySQL saltando la autentificación y deshabilitando la escucha de la red, digo por aquello de los hackers, con el siguiente comando tambien habilitamos el servicio en background (con el amperson se indica eso)

mysqld –skip-grant-tables –skip-networking &

Ahora si, nos conectamos al servidor de MySQL, especificamente la tabla mysql

mysql mysql -u root

Y pues a ejecutar el siguiente comando:

UPDATE user SET password=PASSWORD(‘mi_nueva_clave’) WHERE user=”root”;
quit;

Y listo!, matamos el proceso y reiniciamos mysql normalmente., para ver el proceso cuando lo lanzamos en background nos aparecio un número del proceso.

kill -9 NUMERO

Y listo!, a iniciar el servicio (quizas con el restart mata el proceso, pero mejor el kill para estar seguros):

/etc/init.d/mysql restart

A disfrutar del MySQL y claro! no olvidar la clave! jeje.

ERROR: -bash: /bin/rm: La lista de argumentos es demasiado larga

He tratado de eliminar muchisimos archivos temporales, pero al ejecutar el comando: rm * me da el error que los argumentos son demasiados largos.

El problema radica que sustituye el * por los nombres de archivos, y bash solamente soporta 4000 parámetros.

La solución es buscar cada archivo y después eliminarlo, quedando el comando como sigue:

find /tmp/ -name “cache_*” -exec rm {} \;

Substituyendo /tmp/ por la carpeta donde estan los archivos, y cache_* por el nombre del archivo a buscar.

Error al eliminar un directorio con cientos de archivos – /bin/rm: Argument list too long

He estado cambiando sendmail a exim4, y deseo eliminar el directorio de la cola de espera de sendmail, solamente que tiene cientos de archivos, y al hacer un rm * simplemente truena y me aparece el siguiente mensaje:

web:/var/spool/mqueue# rm *
-su: /bin/rm: Argument list too long

La solución es primero listar todos los archivos y 1 por 1 eliminarlos, quizas sea algo lento pero seguro, para eso utilizamos el siguiente comando:

Aquí varias posibles soluciones:

Dentro del directorio:

# find . -name ‘*’ | xargs rm

# ls | xargs rm

# cd /var/spool/mqueue
# for f in *; do rm -f $f; done

ó eliminar archivo menores a 8k, por así decirlo

# find /var/spool/mqueue -size -8k -exec rm -f {} ;

Y ya despues de algo de minutos listo!! el directorio esta vacio!.

Configurar Cherokee remotamente

Si tienes un servidor Cherokee pero no esta en tu maquina local y no tienes acceso fisico a la computadora, entonces esta información te es de ayuda.

Primero entras por SSH a tu servidor y como root activas la interfaz de configuración:

# cherokee-admin

Despues debes de entrar solamente por localhost ó 127.0.0.1 y luego puerto 9090

http://127.0.0.1:9090

cherokee

Pero como estamos remotamente claro que no va a funcionar así que tenemos que abrir un tunel por ssh con:

$ ssh -L 9090:localhost:9090 IPREMOTA

Y listo, ya podemos entrar por http://localhost:9090