Autor Williams Mendez |
Categorías PHP, Programacion, internet |
Fecha 18-02-2010 |
Comentario 0
Este es un ejemplo tomado directamente desde PHP.net, que como siempre digo, es el site con la mejor y oficial documentación de PHP y que muchos no recurren a ella. En el ejemplo se muestra como con Sockets se puede hacer una petición “POST” y capturar la respuesta en una variable:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| < ?php
/* Send POST request to https://secure.example.com/form_action.php
* Include form elements named "foo" and "bar" with dummy values
*/
$sock = fsockopen("ssl://secure.example.com", 443, $errno, $errstr, 30);
if (!$sock) die("$errstr ($errno)\n");
$data = "foo=" . urlencode("Value for Foo") . "&bar=" . urlencode("Value for Bar");
fwrite($sock, "POST /form_action.php HTTP/1.0\r\n");
fwrite($sock, "Host: secure.example.com\r\n");
fwrite($sock, "Content-type: application/x-www-form-urlencoded\r\n");
fwrite($sock, "Content-length: " . strlen($data) . "\r\n");
fwrite($sock, "Accept: */*\r\n");
fwrite($sock, "\r\n");
fwrite($sock, "$data\r\n");
fwrite($sock, "\r\n");
$headers = "";
while ($str = trim(fgets($sock, 4096)))
$headers .= "$str\n";
echo "\n";
$body = "";
while (!feof($sock))
$body .= fgets($sock, 4096);
fclose($sock);
?> |
number of view: 121
Hace unas semanas mi amigo David Tavarez publicó en su Blog un artículo sobre OpenCV, que no es mas que unas librerías bastante interesantes, que permiten identificar un rostro en una imagen. Estas librerías no solo existen para PHP, sino que también la podemos encontrar en C++, Python, otros.
Les dejo una cita del post:
OpenCV wrapper to detect faces with PHP. The extension offers the two new functions: face_count() and face_detect(). In princible, they differ only by their return value. The first returns only the number of faces found on the given image and the other an associative array of their coordinates. face_count() serves only to save the loops for counting. Examples:


Face detection in pure PHP (without OpenCV). This is a PHP Class to face recognition without OpenCV, it use an data file, but not external libraries. We can use it with few code:
$detector = new Face_Detector('detection.dat');
$detector->face_detect('maurice_svay_150.jpg');
$detector->toJpeg();
Example:

number of view: 147
Autor Williams Mendez |
Categorías PHP, Programacion, Tutoriales, internet |
Fecha 08-01-2010 |
Comentario 0
Aquí les dejo una interesantísima función para imprimir el contenido de una variable, ya sea un objeto, un string, un array…
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| < ?php
function show_php($var,$indent=' ',$niv='0')
{
$str='';
if(is_array($var)) {
$str.= "<b>[array][".count($var)."]<br />";
foreach($var as $k=>$v) {
for($i=0;$i< $niv;$i++) $str.= $indent;
$str.= "$indent<em>\"{$k}\"=>";
$str.=show_php($v,$indent,$niv+1);
}
}
else if(is_object($var)) {
$str.= "<b>[objet]-class=[".get_class($var)."]-method=[";
$arr = get_class_methods($var);
foreach ($arr as $method) {
$str .= "[function $method()]";
}
$str.="]-";
$str.="</b>";
$str.=show_php(get_object_vars($var),$indent,$niv+1);
}
else {
$str.= "<em>[".gettype($var)."]</em>=[{$var}]<br />";
}
return($str);
}
?> |
Esta interesante función fue tomada de PHP.net
number of view: 209
En el primer caso les mostraré como hacer una URL que contenga algún “id” o parámetro, como para un e-commerce y los artículos.
RewriteBase /
RewriteRule ^(.*)-(.*).html$ products.php?id=$2
En este ejemplo, prodremos escribir URLs de este tipo:
http://www.ejemplo.com/mi_producto_favorito-451.html
Esto sería lo mismo que escribir:
http://www.ejemplo.com/products.php?id=451
De manera que estamos haciendo lo mismo, pero de manera “más estética” y aplicando nuestras técnicas de SEO
.
Otro ejemplo es algo más simple, pero funcional. Ahora les muestro como crear, por ejemplo, documentos XML dinámicos.
RewriteBase /
RewriteRule ^googlefeed.xml$ googlebase.php
Este ejemplo realmente lo he utilizado para crear feeds para Google Base. La idea es que el XML se genera “en vivo”, por así decirlo, de manera que no se pierde ningún artículo a la hora de que el Robot de Google descargue el documento en cualquier momento.
number of view: 394
Autor Williams Mendez |
Categorías PHP, Programacion, Zend Framework |
Fecha 30-12-2009 |
Comentario 3
El uso de Frameworks hace la vida de un programador, muchas veces, más sencilla o menos monótona, no teniendo así que escribir y reescribir el mismo código decenas de veces en aplicaciones diferentes. Además de esto, hacen que se mantenga cierto patrón al escribir programas(siempre y cuando estemos conscientes de lo que estamos haciendo), dándole algo de uniformidad al código y se puede decir que un estilo fácil de entender.
Por otro lado, tenemos otras ventajas obvias, como es el uso de clases y métodos que no nos interesa desarrollar, ya sea porque sería complicado o porque no nos importa.
Es claro que estas maravillosas herramientas han aportado al ágil desarrollo de aplicaciones, de la misma manera que han contribuido a que no nos preocupemos por ciertos algoritmos, pues ya están hechos y listos para ponerlos en práctica. También es una grandísima ventaja el hecho de trabajar con códigos bien revisados y probados(cuando utilizamos frameworks Open-Source o de empresas que pagan por su mantenimiento).
Ahora bien, todo eso es maravilloso cuando ya hemos estudiado un framework en específico, pues para muchos el hecho de tener que
aprender un framework o peor aún, luego de haber aprendido un framework, cambiarse a otro, es una tarea casi tan complicada como escribir tu propio código o desarrollar tu propio framework.
Según este post: Do Frameworks Fail? When?, el uso de frameworks aún presenta tres problemas:
- La curva de aprendizaje, que empeora cuando ya un framework no está siendo mantenido.
- Eficiencia del Código: Muchas veces consumen muchos recursos y el programador no tiene control sobre esto.
- El costo de Propiedad: Muchos te enseñan como hacer lo fácil, pero lo difícil seguirá siendo aún más difícil, y tendrás que invertir tiempo(lo cual es dinero) en buscar el framework más apropiado.
No por esto debemos dejar de utilizar un framework, pero si debemos tener en cuenta cuál es el que se ajusta a cada necesidad.
number of view: 466
Autor Williams Mendez |
Categorías PHP, Programacion |
Fecha 09-12-2009 |
Comentario 0
iPHP es un proyecto que planea desarrollar un Shell interactivo para PHP, al igual que existe en Python y el “irb” en Ruby, que realmente son herramientas muy poderosas y, a mi entender, muchas veces necesarias. Hace un buen tiempo que estuve esperando esto, pues muchas veces he sentido la necesidad de una aplicación de este tipo.
El Interactive Shell es un Shell que permite evaluar expresiones arbitrarias y que muestra el resultado en tiempo real a medida que vas escribiendo tu script. Este Shell es sumamente útil si estamos Debbuging, probrando cosas rápidamente, en fin, una herramienta muy poderosa.
Aquí les dejo algo para que vean de que se trata:
iphp is an interactive php shell that solves a number of painful problems with normal php shells:
- Fatal Error handling – iphp doesn’t die even if your code does.
- autocomplete support (tab key)
- history support across runs
- implemented as a class for integration with your framework
- require support (supports dynamic includes)
Example:
> new ArrayObject(array(1,2))
ArrayObject Object
(
[0] => 1
[1] => 2
)
> $_[0] + 1
2
number of view: 181
Mucha gente tiene la confusión de si se puede o no correr un programa escrito en PHP desde la línea de comandos. Pues aquí les respondo que sí y les traigo algo para que vayan comprendiendo su funcionamiento.
El siguiente ejemplo se trata de un pequeño compresor de archivos con una técnica muy barata que he hecho para una clase de Codificación y que luego les mostraré de qué se trata.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
| < ?php
/**
* Compress.php
*
* ejemplo de corrida:
* $ php compress.php ARCHIVO_ENTRADA
* $ php compress.php -d ARCHIVO_ENTRADA ARCHIVO_SALIDA
*/
//saber los parametros que fueron pasados al correr el programa
if($argc < 2 )
exit("Debe especificar al menos el archivo de entrada.\n");
define('COMPRESS',1);
define('UNCOMPRESS',2);
//saber que opcion se ha tomado
/**
* La opcion '-c' es para comprimir
* La opcion '-d' es para decomprimir
* si no se especifica opcion, se va a comprimir
*/
if($argv[1][0] == '-') {
switch($argv[1]) {
case '-c':
$action = COMPRESS;
break;
case '-d':
$action = UNCOMPRESS;
break;
default:
die("Opcion '{$argv[1]}' Incorrecta. Utilice '-c' para comprimir y '-d' para decomprimir.\n");
}
//archivo de entrada
$source_file = $argv[2];
//se verifica si el usuario especifico archivo de salida, de lo contrario
// se verifica si se va a comprimir para generar el fichero de salida.
// Si es para decompresion, se debe especificar el fichero de salida.
if($argc > 3)
$destination_file = $argv[3];
else if($action == COMPRESS){
$ext = end(explode(".", $source_file));
$destination_file = str_replace(basename($source_file),str_replace($ext,'wmz',basename($source_file)),$source_file);
}else{
die ("Debe especificar el archivo de salida, no se conoce la extension del archivo original\n.");
}
}
else {
//Lo mismo que el paso anterior, pero ahora se sabe que es compresion porque
// no se especificó una opcion y se asume compresion.
$action = COMPRESS;
$source_file = $argv[1];
if($argc > 2)
$destination_file = $argv[2];
else {
$ext = end(explode(".", $source_file));
$destination_file = str_replace(basename($source_file),str_replace($ext,'wmz',basename($source_file)),$source_file);
}
}
//Incluimos la clase BitMapping
//Notese que se producirá un error Fatal si no existe el fichero BitMapping.php
require_once 'BitMapping.php';
// Crear instancia
$compressor = new BitMapping($source_file,$destination_file);
//Proceder a Comprimir o Decomprimir
switch($action) {
case COMPRESS:
$compressor->compress();
break;
case UNCOMPRESS:
$compressor->uncompress();
break;
}
?> |
En los próximos días publicaré la Class que comprime y decomprime =)
number of view: 181
PHP nos ofrece la facilidad de usar algunos métodos mágicos en nuestras Classes que pueden servirnos de muchísima ayuda y que muchos dejan pasar por alto estas herramientas, muchas veces muy eficientes y útiles. Hoy les traigo algunos ejemplos del uso del método mágico “__set”.
El método __set es invocado cuando intentamos asignarle valor a una propiedad existente o no de un objeto. Veamos este primer ejemplo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| < ?php
class MyClass{
private $_var1;
public function __construct($var = null){
$this->_var1 = $var;
}
public function printVar($varname){
print $this->$varname;
}
public function __set($var, $value){
$this->$var = $value;
}
}
?>
/***************************************************/
//Ejemplo de uso:
$MyObject = new MyClass;
$MyObject->myvar = 5;
$MyObject->printVar('myvar'); // Salida sera: 5 |
En el ejemplo anterior, la propiedad MyClass::myvar no existe, pero es creada en ese instante que se le asigna el valor “5″.
Otro buen ejemplo puede ser este que encontré en TuxRadar.com:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| < ?php
//...[snip - add your MySQL connection code here]...
class mytable {
public $Name;
public function __construct($Name) {
$this->Name = $Name;
}
public function __set($var, $val) {
mysql_query("UPDATE {$this->Name} SET $var = '$val';");
}
// public $AdminEmail = 'foo@bar.com';
}
$systemvars = new mytable("systemvars");
$systemvars->AdminEmail = 'telrev@somesite.net';
?> |
number of view: 192
Ayer mi compañero David Tavarez hizo un tweet diciendo que debemos apoyar lo nuestro, los dominicanos generalmente no apoyamos nuestras cosas, nuestra cultura, nuestra gente, nuestras creaciones, nada nuestro. Es por eso que David y yo estamos en el plan de empezar a unir a todos los desarrolladores de Software y amantes de la tecnología de la región, principalmente de Santiago.
La iniciativa pretende unir, en encuentros sociales, a todos aquellos que sean muy famosos como aquellos que no lo sean tanto pero que se identifican con lo que hacen porque les encanta igual que a nosotros…
Apoyemos lo nuestro!!
number of view: 125
Autor Williams Mendez |
Categorías PHP, Programacion |
Fecha 04-11-2009 |
Comentario 0
Esta es una función realmente útil que muchas veces hacemos 3000 cosas para lograr algo parecido y algoritmos super complicados. Esta forma de contar elementos la aprendí del Profesor Felipe Núñez en una clase de Estructura de Datos, y la he puesto aquí porque vi algo parecido en el blog de mi pana David Tavarez
1
2
3
4
5
6
7
8
9
| function getRepetitions($value, array $values){
if(!sizeof($values))
return false;
foreach($values as $v){
$rep[$v]++;
}
return (int)$rep[$value];
}
print getRepetitions(3,array(3,3,3,5,6,4,3,6,5,4,6,3,2,8,8))."\n"; |
number of view: 140
Esta ha sido una rapidita pero exitosa modificacion para usar mi acortador MicroUri y no bit.ly en el plugin Tweetme de Wordpress.
Para hacer esto, solo hay que modificar una funcion llamada “tweetme_bitly_link”.
La funcion original se ve asi:
1
2
3
4
5
6
7
8
| function tweetme_bitly_link($id) {
if (function_exists('revcanonical_shorten') && $link = revcanonical_shorten($id)) {
return $link;
} else {
$link = get_permalink($id);
return file_get_contents('http://bit.ly/api?url=' . $link);
}
} |
La modificacion solo contiene tres lineas extras:
1
2
3
4
5
6
7
8
9
10
11
12
13
| function tweetme_bitly_link($id) {
if (function_exists('revcanonical_shorten') && $link = revcanonical_shorten($id)) {
return $link;
} else {
$link = get_permalink($id);
/**Williams Mendez **/
$ob = @simplexml_load_file('http://api.microuri.com/get.php?url='.$link);
if(is_object($ob) && isset($ob->Response) && strlen($ob->Response))
return $ob->Response;
return file_get_contents('http://bit.ly/api?url=' . $link);
}
} |
number of view: 217
Autor Williams Mendez |
Categorías General, PHP, Programacion, internet |
Fecha 01-11-2009 |
Comentario 0
Esta es una expresión regular bastante fea, pero igual funciona y puede ser muy útil el ejemplo para quien quiera tomar de ejercicio el ejemplo, pues apuesto a que alguno de ustedes que me visitan quizas no saben lo que es una expresion regular y puede que sea un buen momento para que empiecen a investigar…
1
2
3
4
5
6
| < ?php
function valid_ip($ip) {
return preg_match("/^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])" .
"(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/", $ip);
}
?> |
number of view: 144
PHP 5.3.0 offers a wide range of new features:
- Support for namespaces has been added.
- Support for Late Static Bindings has been added.
- Support for jump labels (limited goto) has been added.
- Support for native Closures (Lambda/Anonymous functions) has been added.
- There are two new magic methods, __callStatic and __invoke.
- Nowdoc syntax is now supported, similar to Heredoc syntax, but with single quotes.
- It is now possible to use Heredocs to initialize static variables and class properties/constants.
- Heredocs may now be declared using double quotes, complementing the Nowdoc syntax.
- Constants can now be declared outside a class using the const keyword.
- The ternary operator now has a shorthand form: ?:.
- The HTTP stream wrapper now considers all status codes from 200 to 399 to be successful.
- Dynamic access to static methods is now possible.
- Exceptions can now be nested.
- A garbage collector has been added, and is enabled by default.
Source: PHP.net
number of view: 200