Instalar latex en Ubuntu

Buena entrada para instalar Latex y texmaker en Ubuntu

Enlace  —  Publicado: 2 febrero, 2014 en GNU/Linux, Sistemas operativos

 

Interesante web donde se puede probar código javascript además de distintos frameworks: mootools, YUI, jquery etc.

 

Para probar javascript

Enlace  —  Publicado: 18 enero, 2014 en Javascript
Etiquetas: , , ,

En el post anterior se explicaba como compilar, ejecutar  y ejecutar cUrl o crear un programa/script que use libcURL. En este post se explicará como mandar una petición HTTP Post a un servidor.  Si no se tiene muy claro la forma en que trabaja un servidor Web con estas llamadas leer en wikipedia ( en inglés ) este artículo http://en.wikipedia.org/wiki/POST_%28HTTP%29

Este tipo de método de respuesta del protocolo HTTP es utilizado para mandar datos a un servidor, en este post explicaré como mandar datos a un servidor sin entrar en su código es decir solo conoceremos código HTML o cliente.

Supongamos que tenemos este formulario web que modifica el volumen de sonido de un servidor remoto ( http://localhost/modifysound

formulario web

El código HTML sería el siguiente:

<div class="Notes form">
<form id="SoundsEditForm" accept-charset="utf-8" method="post" action="/modifysound">
<div style="display:none;">
<input type="hidden" value="POST" name="_method">
</div>
<fieldset>
<legend>
<input id="sound" type="number" value="23" name="data[Sounds][sound]">
<div class="submit">
<input type="submit" value="Save">
</div>
</form>
</div>

Los campos Input son los que configuran los valores que se le envía al servidor cuando hacemos la petición POST, en este caso nuestro programa los mandará automaticamente, en este caso el formulario solo tiene un campo:

<input id="sound" type="number" value="23" name="sound">

La respuesta del servidor correcta sería:

<p>
 <h2>TCP/IP Connection</h2>
OK.
Attempting to connect to '127.0.0.1' on port '5000'...OK.
Sending HTTP HEAD request...OK.
Closing socket...OK.
</p>

El código C para hacer la petición:

{
	CURL *curl;
	CURLcode res;
	//
	// Init Curl
	//
	curl = curl_easy_init();
	if(!curl) 
	{
		return 1;
	}
	//
	// Init parameters
	//
	curl_easy_setopt(curl, CURLOPT_URL, "http://localhost/modifysound");
	curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "data[Sounds][sound]=45");
	//
	// Execute command ( curl )
	//
	res = curl_easy_perform(curl);
	//
	// Check Errors
	//
	if(res != CURLE_OK)
	{
		fprintf(stderr, "curl_easy_perform() failed: %s\n",
		curl_easy_strerror(res));
	}
	//
	// always cleanup 
	//
	curl_easy_cleanup(curl);
	return 0;
}

Una vez se compile y ejecute el programa por la salida estándar deberíamos de ver  una respuesta del servidor, En este ejemplo no se ha descrito el código de la parte del servidor solo del cliente, con lo cual la parte del servidor se debería desarrollar en el lenguaje/framework que se prefiera.

En las opciones de cURL hay que destacar CURLOPT_POSTFIELDS, si en este formulario existiese más de un campo a mandar al servidor ser mandaría de esta manera: “dato1=2&dato3=3” donde se le envía dos variables dato1 y dato3 con los valores 2 y 3.

Espero que os sirva.
Un saludo.

Una herramienta que debería conocer todo programador/administrador de sistemas en cURL, utilizada para automatizar por línea de comandos transferencias de datos los distintos protocolos soportados. Además de este programa por línea de comandos, existe libcURL para poder ser usada desde C/C++ y existen versiones de esta biblitoteca según wikipedia en más de 50 lenguajes, en los que yo destaco C#,PERL,Python y PHP.

Definición Según wikipedia:

[...] cURL es una herramienta para usar en un intérprete de comandos para transferir archivos con sintaxis URL, soporta FTP, FTPS, HTTP, HTTPS, TFTP, SCP, SFTP, Telnet, DICT, FILE y LDAP. cURL soporta certificados HTTPS, HTTP POST, HTTP PUT  [...]

Algunos usos frecuentes de cURL.

  • Transferencias de datos en multitud de protocolos
  • Web Testing
  • Testing de servidores FTP.

Instalación de cURL/LibcURL

Para instalar cURL en ubuntu solo hace falta abrir una consola y escribir sudo apt-get install curl, pero yo quiero construir mi propia versión de cURL para que me soporte protocolos con ssl, ssh o rtmp, para ello previamente hay que instalar los siguientes paquetes en Ubuntu:

  • libssl-dev
  • libssh2-1.dev
  • librtmp-dev

Hay que descargar la última versión del código fuente en:  http://curl.haxx.se/, desde donde se puede encontrar la última versión de cURL que hoy es la 7.31.0, una vez se descargue  y se descomprima el tar.gz, se abre una consola dentro de la carpeta de instalación que en mi caso es /home/erjaimer/curl-7.31.0 y se procede a configurar la compilación para que soporte más protocolos:

$>./configure --with-ssl --with-ssh --with-rtmps

La Salida de esta orden es la siguiente, en donde se puede observar en rojo los protocolos soportados:

configure: Configured to build curl/libcurl:

  curl version:     7.31.0
  Host setup:       i386-pc-linux-gnu
  Install prefix:   /usr/local
  Compiler:         gcc
  SSL support:      enabled (OpenSSL)
  SSH support:      enabled (libSSH2)
  zlib support:     enabled
  krb4 support:     no      (--with-krb4*)
  GSSAPI support:   no      (--with-gssapi)
  SPNEGO support:   no      (--with-spnego)
  TLS-SRP support:  enabled
  resolver:         default (--enable-ares / --enable-threaded-resolver)
  ipv6 support:     enabled
  IDN support:      no      (--with-{libidn,winidn})
  Build libcurl:    Shared=yes, Static=yes
  Built-in manual:  enabled
  --libcurl option: enabled (--disable-libcurl-option)
  Verbose errors:   enabled (--disable-verbose)
  SSPI support:     no      (--enable-sspi)
  ca cert bundle:   /etc/ssl/certs/ca-certificates.crt
  ca cert path:     no
  LDAP support:     no      (--enable-ldap / --with-ldap-lib / --with-lber-lib)
  LDAPS support:    no      (--enable-ldaps)
  RTSP support:     enabled
  RTMP support:     enabled (librtmp)
  metalink support: no      (--with-libmetalink)
  Protocols:        DICT FILE FTP FTPS GOPHER HTTP 
  HTTPS IMAP IMAPS POP3 POP3S RTMP RTSP SCP SFTP SMTP SMTPS TELNET TFTP

Faltaría compilar e instalar:

$> sudo make
$> sudo make install

Ahora quedaría testear si tenemos cURL correctamente instalado

$> curl
curl: try 'curl --help' or 'curl --manual' for more information

Ya se podría ejecutar cURL con los siguientes protocolos:

  • DICT
  • FILE
  • FTP
  • FTPS
  • GOPHER
  • HTTP
  • HTTPS
  • IMAP
  • IMAPS
  • POP3
  • POP3S
  • RTMP
  • RTSP
  • SCP
  • SFTP
  • SMTP
  • SMTPS
  • TELNET
  • TFTP

Probando y compilando un ejemplo con libcURL:

Para este post voy a compilar el ejemplo más sencillo un get HTTP, este ejemplo se puede descargar desde https://raw.github.com/bagder/curl/master/docs/examples/simple.c  pero voy a poner su código fuente, el fichero se llamaría http.c si se descarga a nuestro ordenador:

#include <stdio.h>
#include <curl/curl.h>

int main(void)
{
  CURL *curl;
  CURLcode res;

  curl = curl_easy_init();
  if(curl) {
    curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
    /* example.com is redirected, so we tell libcurl to follow redirection */
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);

    /* Perform the request, res will get the return code */
    res = curl_easy_perform(curl);
    /* Check for errors */
    if(res != CURLE_OK)
      fprintf(stderr, "curl_easy_perform() failed: %s\n",
              curl_easy_strerror(res));

    /* always cleanup */
    curl_easy_cleanup(curl);
  }
  return 0;
}

Para compilar y ejecutar:

$> gcc -o http http.c -lcurl && ./http

La salida sería el código HTML de http://www.example.com, para obtener más información sobre ejemplos y documentación visitar: http://curl.haxx.se/libcurl/c/example.html

Utilizando la ordén cURL

Para obtener el mismo resultado que el programa http compilado anteriormente hay que utilizar la orden de la siguiente manera:

$> curl http://www.example.com

Espero que os sirva.

Un saludo

En un post anterior se explicó como mandar peticiones HTTP Get usando CakePHP Framework, En este post se explica como mandar una petición Get con Basic-Auth ( autenticación de acceso básica ).

Según wikipedia.org:

En el contexto de una transacción HTTP, la autenticación de acceso básica  es un método diseñado para permitir a un navegador web, u otro programa cliente, proveer credenciales en la forma de usuario y contraseña cuando se le solicita una página al servidor.

El formato de HttpSocket de CakePHP cuando hace una petición get o post es el siguiente:

  • string get($uri, $query, $request) # petición GET
  • string post($uri, $query, $request) # petición POST

Es el array $request lo que configura la respuestas con múltiples opciones, en este caso se va configura un Basic-Auth de la manera siguiente:

		
function index()
	{
		App::import('Core', 'HttpSocket');
		$HttpSocket = new HttpSocket();
		$response = array
		(
			'auth' => 
				array
				(
					'method' => 'Basic',
					'user' =>   'user',
					'pass' =>   '12345'
				)
		);
		$results = $HttpSocket->get('http://example.com',null,$response);
		debug($results);
		debug($HttpSocket->response);	
		die;
	}

De esta manera ya se podría leer el contenido de la web normalmente, sin que el server responda con un 401 ( autorización requerida ), para saber más sobre los código de respuesta del protocolo HTTP consultar: http://es.wikipedia.org/wiki/Anexo:C%C3%B3digos_de_estado_HTTP

Fuentes:

Espero que os sirva.

Un saludo

Según wikipedia:

“Ésta es una extensión de archivo para denotar ficheros de configuración utilizados por aplicaciones de los sistemas operativos Windows.

El término proviene de “Windows Initialization file”, es decir, archivo de inicialización de Windows”

Muchas aplicaciones de windows, como el registro, o incluso PHP con su fichero ( php.ini ) utilizan este formato, aunque actualmente si se lee el artículo de wikipedia esta abandonandose su uso a favor de formatos como XML más estándar.

Se puede pasar un fichero .INI a un hash del lenguaje Perl bastante fácil, utilizando la biblioteca  libconfig, se puede descargar si usas Ubuntu:

$> sudo apt-get install  libconfig-simple-perl

Un fichero .INI de este formato:

[Red]
; Poner UsarProxy=0 si no hay cortafuegos
UsarProxy=1
Proxy=129.129.129.129

[Preferencias]
PaginaInicio=http://wikipedia.org
Maximizar=1

Se pasa a un hash de Perl de esta manera:

#!/usr/bin/perl -w
use Config::Simple; # libconfig-simple-perl
$iniFile = 'example.ini';
if( -e $iniFile  )
{
	Config::Simple->import_from($iniFile, \%Config);#read_config file
	foreach $key( keys %Config )
	{
		print "$key $Config{$key }\n";
	}
}

En la salida se muestra el contenido del hash:

Red.UsarProxy 1
Preferencias.PaginaInicio http://wikipedia.org
Red.Proxy 129.129.129.129
Preferencias.Maximizar 1

De manera que si se quiere saber si la Red puede usar proxy se tiene que consultar la clave de Config:

$Config{Red.UsarProxy} == 1

Fuentes:

Espero que os sirva

Un saludo

Siempre que se programa en un lenguaje como C++ se echa de menos un recolector de basura o al menos algo que nos automatice los new y delete  que se hacen a los objetos, aquí es donde entran estas dos estructuras que voy a explicar a continuación:

auto_ptr

Es una objeto que recibe un puntero y al salir del ámbito libera su memoria, pero tiene un problema, cuando este se copia o se pasa por valor a una función también se copia el puntero que aloja, así que nos puede jugar malas pasadas como se observa en este ejemplo:

#include <memory>
#include <iostream>
#include <iostream>
using namespace std;

class A
{
public:
	string name;
	~A()
        { 
            std::cout << name << " adios A" << std::endl; 
        }
};
class B
{
public:
	std::auto_ptr<A> a;
	string name;
};
void fun(B b )
{
 //esto destruye el auto_ptr
}
int main()
{
	auto_ptr< A > oAPtr( new A() );
	B v1;
	v1.name = "j1";
	v1.a = (oAPtr);
	fun(v1);
	std::cout << "No debe hacer un Delete";

  return 0;
}

La salida es la siguiente:

 adios aim
No debe tener un Delete

Como se observa al pasar el objeto a la función, el objeto ha llamado al delete, es decir el auto_ptr al copiarse también copia el puntero y lo elimina, esto puede resultar muy peligroso e incluso confuso para programas grandes o aplicaciones que tengan que devolver objetos, por eso me gusta mas shared_ptr.

shared_ptr

Incluida en el conjunto de bibliotecas boost y actualmente incluido en el estándar C++11, este tipo de contenedor es muy parecido a auto_ptr, solo que a diferencia del anterior al hacer copias, espera a que todos los objetos shared_ptr que tengan el mismo puntero como contenedor hayan sido destruidos y entonces hace el delete, una funcionalidad que se echaba de menos en este lenguaje.

#include <algorithm>
#include <boost/shared_ptr.hpp>
#include <iostream>
using std::vector;
using std::string;
class A
{
public:
	string name;
	~A()
	{ 
		std::cout << name << " adios aim" << std::endl; 
	}
};
class B
{
public:
	boost::shared_ptr<A> a;
	string name;
};

void fun( B b )
{
}
int main()
{
	boost::shared_ptr< A > oAPtr( new A() );
	B v1;
	v1.name = "j1";
	v1.a = (oAPtr);
	fun(v1);
	std::cout << "No debe tener un Delete\n";

	return 0;
}

La salida sería la siguiente:

No debe tener un Delete
adios aim

Como se puede observar el objeto no se ha eliminado hasta que verdaderamente ha salido de ámbito la aplicación y hasta que todos los boost::shared_ptr no han sido eliminados no se ha realizado un delete del objeto.

Fuentes:

Espero que os sirva

Un saludo