JDownloader: Script de reconexión para Infinitum Huawei Echolife HG520b (actualizado)

Por alguna extraña razón el software JDownloader ya no se reconectaba como antes, entonces viendo el log me doy cuenta que la página que utilizaba para la reconexión fue cambiada (no se si el modem se actualice automagicamente).

Aquí les pongo el nuevo script para el Huawei Echolife HG520b, versión del software: V100R001B122Telmex versión del firmware: 3.10.18.8-1.0.7.0 por si las moscas jejeje.. (sirve que si vuelve a fallar para saber que versión estaba)

Todo lo demás es como el post viejo sobre el echolife HG520b

[[[HSRC]]]
[[[STEP]]]
[[[REQUEST]]]
GET / HTTP/1.1
Host: %%%routerip%%%
Authorization: Basic %%%basicauth%%%
[[[/REQUEST]]]
[[[/STEP]]]
[[[STEP]]]
[[[REQUEST]]]
POST /Forms/bottom_restart_1 HTTP/1.1
Host: %%%routerip%%%
defaltRomFlag=0&defaultIpFactory=%%%routerip%%%&Restart_factory=0
[[[/REQUEST]]]
[[[/STEP]]]
[[[/HSRC]]]

Aquí la versión manual:

PHP: la función imagefilter no es reconocida en PHP5

Estaba probando la creación de mapas de calor (heat map) con PHP y en mi maquina local todo funciona correcto para al pasarla al servidor saaz, error de PHP.

Fatal error: Call to undefined function imagefilter()

revisando la documentación de la función imagefilter dice que viene en la librería GD y PHP5, los 2 programas ya los tenia instalados, pero aún así no reconocía la función, e investigando dice que se ocupa instalar la libreria PHP5-GD Bundled (embedida o empaquetada), ya que la versión original fue desarrollada por Boutell.

Ahora al grano! a instalar la nueva librería, para eso la vamos a compilar todo a mano, jejeje:

apt-get update
apt-get install build-essential debhelper fakeroot
cd /usr/src
apt-get source php5
apt-get build-dep php5
cd php5-5.2.4

Recuerden cambiar la versión del PHP descargada, despues a modificar el archivo debian/rules

nano ./debian/rules

Buscamos la línea que diga:

–with-gd=shared,/usr –enable-gd-native-ttf \

Y la cambiamos por esta:

–with-gd=shared –enable-gd-native-ttf \

Ahora viene la parte tardadaaaaaa!!! a compilar todo,

dpkg-buildpackage -rfakeroot
cd ..
apt-get remove php5-gd
dpkg -i php5-gd_5.2.4-2ubuntu5.14_i386.deb

Reiniciamos apache y listo! la librería php5-gd debe de quedar OK!..

/etc/init.d/apache2 restart

Aca una imagen de como quedo el mapa de calor:

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:

No existe offset (antes decia: LIMIT) en MS SQL Server

Así como suena el titulo, en Microsoft SQL Server no existe la función limit , para implementarla tienes que usar algunos trucos con subconsultas., algo tan sencillo en MySQL como: SELECT * FROM miTabla LIMIT 2,10 en SQL Server se vuelve una calamidad.

Buscando en Internet, encontré en Foros del Web una explicación de como hacer funcionar, se tiene que poner una subconsulta SQL con algo que diga: ROW_NUMBER() OVER (ORDER BY campo) as NumRows y despues se hace un WHERE con su respectivo Between para poner el limite: WHERE NumRows BETWEEN 2 AND 10

Aca un ejemplo más elaborado:

SELECT *
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY mi_Campo1) AS NumRows, *
FROM mi_Tabla
) as AS_NumRows
WHERE AS_NumRows.NumRows BETWEEN 10 AND 20

Si se requiere algún WHERE en nuestra consulta SQL se debe de meter en la subquery, en caso que no tengamos ningun campo a ordenar se cambia lo que tiene ROW_NUMBER, ORDER BY por la siguiente información:

ROW_NUMBER() OVER (ORDER BY (SELECT 1))

Y listo!.., no he probado el rendimiento pero pues aquí una solución extra.

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.