. // // Alexey A.Znayev, znaeff@mail.ru, http://xbsoft.org, http://xbsoft.ru // /////////////////////////////////////////////////////////////////////////// // This file contains public class DNSBL // This class performs IP address check in spam blocking lists as described // on http://ru.wikipedia.org/wiki/RBL class DNSBL { private $_aCheckers = array( // list of checkers available for individual checking 'spamhaus' => array('.zen.spamhaus.org', true), //available for group checking with 'all' key 'spamcop' => array('.bl.spamcop.net', true), //available for group checking with 'all' key 'dsbl' => array('.list.dsbl.org', false), //not available for group checking with 'all' key 'ordb' => array('.relays.ordb.org', false), //not available for group checking with 'all' key 'sorbs' => array('.dnsbl.sorbs.net', false), //not available for group checking with 'all' key 'njabl' => array('.dnsbl.njabl.org', false) //not available for group checking with 'all' key ); // AZ - 1. Key 'all' is illegal // AZ - 2. Most of spammer IP addresses is covered by 'spamhaus' & 'spamcop' (and they are fast), // some of the rest may not work sometimes, you can make them group checking available after individual testing private $_sDefaultChecker = 'spamhaus'; /////////////////////////////////////////////////////////////////////////// // CheckSpamIP - check IP for spam in checkers : given, default or all available for group checking (may be slow) // parameters: // string $ip - ip address // string $checker - checker name or 'all' or nothing // returns: // true when IP exitsts in spam-lists of $checker or at least one of all checkers // false when not or when ip address is local or not correct public function CheckSpamIP($ip, $checker = ''){ if(empty($ip)) return false; if(preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/', $ip) != 1) return false; $octets = explode('.', $ip); if($octets[0] == '127') return false; if($octets[0] == '10') return false; if($octets[0] == '192' && $octets[0] == '168') return false; if($octets[0] == '169' && $octets[0] == '254') return false; // ms windows if((int)$octets[0] > 255 || (int)$octets[1] > 255 || (int)$octets[2] > 255 || (int)$octets[3] > 255 ) return false; $ret_val = false; $PTR = implode(array_reverse($octets), '.'); if($checker === 'all'){ foreach(array_values($this->_aCheckers) as $c){ if($c[1]){ $ret_val = $ret_val || $this->_CheckDNSAnswer(dns_get_record($PTR . $c[0], DNS_A)); } if($ret_val) break; } }else if(array_key_exists($checker, $this->_aCheckers)){ $ret_val = $this->_CheckDNSAnswer(dns_get_record($PTR . $this->_aCheckers[$checker][0], DNS_A)); }else{ $ret_val = $this->_CheckDNSAnswer(dns_get_record($PTR . $this->_aCheckers[$this->_sDefaultChecker][0], DNS_A)); } return $ret_val; } /////////////////////////////////////////////////////////////////////////// // GetCheckers - gets list of available checker names // returns: // array of strings public function GetCheckers(){ return array_keys($this->_aCheckers); } /////////////////////////////////////////////////////////////////////////// // GetGroupCheckers - gets list of checker names available for group checking with 'all' key // returns: // array of strings public function GetGroupCheckers(){ $ret_val = array(); foreach(array_keys($this->_aCheckers) as $k) if($this->_aCheckers[$k][1]) array_push($ret_val, $k); return $ret_val; } /////////////////////////////////////////////////////////////////////////// // GetDefaultChecker - gets default checker name // returns: // string public function GetDefaultChecker(){ return $this->_sDefaultChecker; } /////////////////////////////////////////////////////////////////////////// // SetDefaultChecker - sets default checker name // parameters: // string $new_checker - new default checker name // returns: // true when success // false when failed ($new_checker is not in the list of available checker names) public function SetDefaultChecker($new_checker){ if(array_key_exists($new_checker, $this->_aCheckers)){ $this->_sDefaultChecker = $new_checker; return true; }else{ return false; } } /////////////////////////////////////////////////////////////////////////// // EnableGroupChecking - sets checker available for group checking // parameters: // string $checker - checker name // returns: // true when success ($checker is included) // false when failed ($checker is not in the list of available checker names) public function EnableGroupChecking($checker){ if(array_key_exists($checker, $this->_aCheckers)){ $this->_aCheckers[$checker][1] = true; return true; }else{ return false; } } /////////////////////////////////////////////////////////////////////////// // DisableGroupChecking - sets checker not available for group checking // parameters: // string $checker - checker name // returns: // true when success ($checker is excluded) // false when failed ($checker is not in the list of available checker names) public function DisableGroupChecking($checker){ if(array_key_exists($checker, $this->_aCheckers)){ $this->_aCheckers[$checker][1] = false; return true; }else{ return false; } } // private methods /////////////////////////////////////////////////////////////////////////// // _CheckDNSAnswer - checks DNS-server answer for 127.0.0.* values // returns: // true when success // false when failed private function _CheckDNSAnswer($dns_answer){ if(!is_array($dns_answer)) return false; $len = count($dns_answer); if($len <= 0) return false; for($i=0; $i<$len; $i++){ $obj = $dns_answer[$i]; if(!(is_object($obj) || is_array($obj))) return false; $ip_str = $obj['ip']; if(!is_string($ip_str)) return false; $pos = strpos($ip_str, '127.0.0.'); if($pos !== false) return true; } return false; } } // end of class DNSBL ?> A prueba: Mini teclado bluetooth

A prueba: Mini teclado bluetooth

Móviles, tablets y consolas disponen hoy en día de la tecnología Bluetooth para la conexión de distintos periféricos, y un periférico casi indispensable es un teclado.

Teclado Bluetooth

Este teclado Bluetooth, dadas sus dimensiones (145x70x12mm) y su peso (88g) se trata de un teclado físico óptimo para el uso mediante los pulgares. Este teclado no es uno más de la extensa lista que podemos encontrar en las tiendas, algunas de sus particulares características son:

Conexión de 2 dispositivos

El teclado Dual-Connect Bluetooth Slimline dispone en su parte trasera de un conmutador para intercambiar entre 2 dispositivos. Esto es, teniendo previamente los 2 dispositivos enlazados, cambiar de escribir para el móvil y para el portátil es tan fácil como cambiar el conmutador.

teclado_trasero

Teclado QWERTY completo

Este teclaro QWERTY cuenta con 54 teclas, en las cuales disponemos de todas las letras, números, caracteres especiales, teclas de función, teclas multimedia y más.

Touchpad integrado

Una de las grandes bazas de este teclado se trata del touchpad que lleva integrado en su esquina superior derecha. Gracias a dicho touchpad disponemos de un ratón totalmente operativo en el dispositivo que estemos conectado. Dispone de esta forma de las 2 teclas del ratón, haciendo así bastante más fácil la interacción con el sistema operativo del ordenador o del propio móvil como si del propio dedo se tratase.

teclado

Funda protectora

Cuando no hagamos uso del teclado se puede meter en la funda/carcasa que trae consigo, la cual no añade volumen alguno y tenemos de esta forma el teclado bastante protegido

Batería recargable

Olvidémonos de las pilas. Este teclado lleva integrada una batería recargable mediante miniUSB la cual tiene una autonomía de unas 30 horas. Además, el propio teclado dispone de otro conmutador en su parte trasera para apagarlo y así ahorrar aún más.

Dándole uso

El teclado lo hemos probado con un Galaxy Nexus, una Nexus 7 y la PlayStation3, todo a la primera y sin problema alguno. Su funcionamiento ha sido tan fácil como activar el teclado, pulsar el botón de emparejamiento (ver foto anterior), pedir conexión desde el dispositivo, introducir el código mostrado y listo.

teclado_Tablet2

Al buscar desde el tablet el teclado nos pide que introduzcamos desde el mismo el código, haciendo esto ya lo tendremos enlazado

teclado_tablet

Una vez conectado el teclado al tablet, nos aparece el puntero que podemos controlar gracias al touchpad integrado

Para los que se pregunten cual es la sensación en las manos, podemos decir que el tacto del teclado y su frontal de aluminio nos recuerda a las calculadoras Casio de hace unos años. La escritura en el mismo puede costar al principio si se está acostumbrado a escribir en una pantalla del móvil (teclado más pequeño y sin relieve), pero es cuestión de tratarlo durante un tiempo y la escritura se hace fluida.

Quienes tengan instalado un teclado del tipo SwiftKey en su móvil, este es compatible con el teclado así que ante la aparición de letras mal tecleadas, éste nos ayudará.

El uso que se le puede dar a un teclado de estos puede variar bastante, ya sea para hacer más comodo el escribir un email desde dispositivos móviles hasta controlar la videoconsola desde el sofá (gracias a sus teclas multimedia).

Dónde hacerse con él

El teclado Dual-Connect Bluetooth Slimline lo podéis comprar en MobileFun a través del siguiente enlace.

Agradecemos públicamente al equipo de MobileFun la disposición y atención que muestran de cara al cliente.

Leave a reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Connect with Facebook