Author: Oriol Rius

Trick: xml2yaml

Reading time: 2 – 3 minutes

Petit trick per convertir un fitxer XML a un fitxer YAML (yml) amb Perl, fan falta les llibreries pertinents de perl.

perl -MYAML -MXML::Simple -e 'print Dump XMLin "fixer.xml"'

Trick: Winsock del WinXP es queda tonto

Reading time: 4 – 7 minutes

En les versions antigues del windows quan la pila TCP/IP es quedava tonta era molt senzill reinstal·lar-la sobretot al 95 que cada 2×3 te la feia tornar a instal·lar. Però en la versió XP ja és més fotuda la cosa i quan el winsock2 es queda tonto és realment difícil reinicar-lo o reinstal·lar-lo.

Per resetejar-lo podeu usar l’ordre:

netsh winsock reset catalog

També podem eleminar dues entrades del registre per forçar una re-instal·lació de la pila winsock:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Winsock
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Winsock2

Re-iniciem la màquina i després anem a les propietats de l’interficie de xarxa i instal·lem de nou el protocol TCP/IP.

Si voleu més informació sobre ambdues solucions podeu anar a:

Review del Dell Latitude X300

Reading time: < 1 minute

Llàstima que el Dell X300, o sigui, el meu portàtil ja no es fabriqui perquè curiosament vaig trobar-me un PDF amb una revisió sobre el portàtil impressionant. Mai havia vist 20 pàgines tan complertes amb les opcions i d’altres que té aquest portàtil.

PHP5: passant i tornant objectes com a paràmetre en una crida SOAP (Part II)

Reading time: 5 – 8 minutes

El mes de març vaig escriure un article titulat gairebé igual que aquest, en aquell article explicava com s’ho feia el PHP5 per rebre i retornar tipus complexes (p.e. objectes) com a paràmetres de crides SOAP. Doncs bé havia trobat una cosa que em tenia una mica mosca i és que quan enviava una objecte del client cap al servidor o alrevés en perdia el tipus. Doncs bé aquesta tarda he descobert com aconseguir fer això sense perdren el tipus. Ja sabeu que quan se’m posa una cosa al cap…

El tema no és senzill i el generador de WSDL del ZendStudio és una mica tiquis-miquis fent aquestes coses així doncs s’ha de fer tot molt maco perquè ho entengui el generador WSDL. De fet, la gràcia esta en definir el tipus complexe dins del fitxer WSDL, per això el generador necessita que li donem tota la informació com ell vol sinó no és capaç de generar bé el fitxer.

En l’exemple que us poso a continuació he creat la classe persona amb tres atributs dos de públics i un de privat. El privat al contrari del que comentava en l’article anterior no perd el seu valor. Així doncs, en principi tenim l’objecte 100% replicat amb el mètode que ara us explicaré.

La classe persona:

<?php
/**
 * classe persona
 *
 */
class persona {
	/**
	 * propietat nom
	 *
	 * @var string $nom
	 * @var string $cognom
	 * @var string $dni
	 */
	public $nom;
	private $cognom;
	public $dni;
	/**
	 * setter function
	 *
	 * @param string $nom
	 */
	function set($nom) {
		$this-?>nom=$nom;
	}
	/**
	 * setter cognom
	 *
	 *  @param string $cognom
	 */
	function setCognom($cognom)
	{
		$this-?>cognom=$cognom;
	}
	/**
	 * getter function
	 *
	 * @return string valor a tornar
	 */
	function get()
	{
		return $this-?>nom;
	}
	/**
	 * getter cognom
	 *
	 * @return string valor a tornar
	 */
	function getCognom()
	{
		return $this-?>cognom;
	}
}
?>

Fixeu-vos que comentem el codi segons la sintaxis del phpDoc això es fa perquè és d’aquests comentaris d’on el generador WSDL extreurà els tipus de les variables per poder-les exportar sense perdre informació. La propietat dni no té ni getter ni setter perquè hi accedirem directament. Per la resta de coses és una classe completament normal i senzilla.

El servidor és força simple:

<?php
require_once("persona.class.php");
/**
 * servidor soap
 *
 */
class soapservice {
	/**
	 * funcio soap publicada
	 *
	 * @param persona $per
	 * @return persona
	 */
	function peticion($per) {
		$per->dni="38147000x";
		return $per;
  }
}
	$server = new SoapServer("server.wsdl",array("classmap"=>array("persona"=>"persona")));
$server->setClass("soapservice");
$server->handle();
?>

Comentar que la classe soapservice rep un objecte de tipus persona afegeix un valor a la propietat dni i retorna el mateix objecte. Aquí també hem de documentar el codi segons la sintaxis del phpDoc així el model WSDL ens dirà explicitament el tipus dels objectes que rep i torna el mètode peticion.

Pel que fa a la creació de l’objecte server del tipus SoapServer fixeu-vos que mapegem amb l’opció classmap l’objecte de tipus persona que es passa com a paràmetre amb la classe local també anomenada persona. Gràcies a aquest mapeig quan rebem l’objecte per al soapservice aquest ja és del tipus persona.

Ara toca veure el codi del client, aquest codi també té un mapeig igual que el servidor de SOAP, però en aquest cas serveix per capturar la sortida del servidor i com que l’objecte que es torna a la sortida també és del tipus persona el classmap és igual que el del servidor.

<?php
require_once("persona.class.php");
// creem objecte tipus persona
$myPersona=new persona;
$myPersona->set("el_nom");
$myPersona->setCognom("el_cognom");
	$client = new SoapClient("server.wsdl",array("classmap"=>array("persona"=>"persona")));
	$localPersona=$client->peticion($myPersona);
	var_dump($client->__getFunctions());
print_r($localPersona);
echo $localPersona->getCognom();
?>

Una de les coses interssants que fem és preguntar quines funcions s’estan publicant al servidor SOAP. Aquesta informació esta descrita al WSDL i la funció __getFunctions() ens la formateja per humans. Així doncs podem veure que hi ha disponible la funció peticion que té com a paràmetre un objecte del tipus persona i que retorna un altre objecte de tipus.

array(1) {
  [0]=>
  string(30) "persona peticion(persona $per)"
}

Després mostrem (print_r) l’objecte localPersona que ens ha tornat la crida al mètode peticion ($localPersona=$client->peticion($myPersona);):

persona Object
(
    [nom] => el_nom
)

Finalment fem una prova de concepte i obtenim el valor de la propietat nom a través del getter, o sigui, echo $localPersona->getCognom();:

el_nom 

Com podeu veure ha quedat ben demostrat que és relativament senzill enviar i rebre tipus complexes a través dels serveis SOAP. Tota la gràcia esta en el fitxer WSDL, a continuació us enganxo el que m’ha generat el Zend Studio per fer aquestes proves fixeu-vos com al prinicipi de tot el primer que fa és declarar el tipus complexe de dades que ha de traspassar, en el nostre cas la classe persona.

<?xml version='1.0' encoding='UTF-8'?>
	<!-- WSDL file generated by Zend Studio. -->
	<definitions name="server" targetNamespace="urn:server" xmlns:typens="urn:server" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:typens0="http://oriol.joor.net/fotoprix/web/cu.php/soap/server">
	<types>
		<xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:server">
			<xsd:complexType name="persona">
				<xsd:all>
					<xsd:element name="nom" type="xsd:string"/>
					<xsd:element name="cognom" type="xsd:string"/>
					<xsd:element name="dni" type="xsd:string"/>
				</xsd:all>
			</xsd:complexType>
		</xsd:schema>
	</types>
	<message name="peticion">
		<part name="per" type="typens:persona"/>
	</message>
	<message name="peticionResponse">
		<part name="peticionReturn" type="typens:persona"/>
	</message>
	<portType name="soapservicePortType">
		<documentation>
			servidor soap
		</documentation>
		<operation name="peticion">
			<documentation>
				provem de descriure
			</documentation>
			<input message="typens:peticion"/>
			<output message="typens:peticionResponse"/>
		</operation>
	</portType>
	<binding name="soapserviceBinding" type="typens:soapservicePortType">
		<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
		<operation name="peticion">
			<soap:operation soapAction="urn:soapserviceAction"/>
			<input>
				<soap:body namespace="urn:server" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
			</input>
			<output>
				<soap:body namespace="urn:server" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
			</output>
		</operation>
	</binding>
	<service name="serverService">
		<port name="soapservicePort" binding="typens:soapserviceBinding">
			<soap:address location="http://oriol.joor.net/soap/server.php"/>
		</port>
	</service>
</definitions>

php: SimpleXML i xml2array

Reading time: < 1 minute

Dues funcions potentissimes de PHP, sobretot ara que cada dos per tres hem de treballar amb fitxers XML.

$xml = simplexml_load_file('fitxer.xml');

Llegeix el fitxer.xml del disc dur i el converteix en un objecte de la classe SimpleXMLElement. Per veure en què es converteix es pot usar print_r.

Ara que ja tenim les dades en forma d’objecte si encara no ens agraden podem convertir-les en un array amb una sola funció:

$varArray = get_object_vars($objXml);

També amb un print_r podem veure un array dels de tota la vida.

Sovint la potència esta en la simplicitat… val la pena no perdre de vista aquestes funcions.

SVN: Tortoise per Linux i Nautilus-scripts

Reading time: 2 – 2 minutes

Per windows tenim disponible el TortoiseSVN una aplicació que queda instal·lada com a opcions de contexte de l’explorer de windows. Ens permet treballar amb el VCS de forma súper còmode. De fet, el subversion es converteix en algo d’allò més senzill gràcies a aquest aplicació i acabes agafant dependència de l’eina.

Doncs bé aquesta eina com passa sovint no existeix per linux i més concretament com a extenció del nautilus per gnome encara menys. Però avui m’he instal·lat un script de nautilus (concepte que desconeixia fins avui) que ens permet d’una forma força rudimentaria, però eficaç, treballar amb el menú de contexte del nautilus directament contra el subversion. Sense haver de sortir a la consola per llençar manualment les comandes més típiques.

Concretament l’script l’he trobat al mariuss’ blog en l’article Nautilus Script for Subversion ens explica com s’ha currat aquest script. De fet, m’he informat sobre aquests scripts del nautilus i són trivials de fer. Quan els domini una mica més ús explico com es fan. De moment ús deixo amb el gusanillo.

Si useu el subversion i no voleu haver d’anar amb la línia de comandes amunt i aball cada dos per tres, us recomano que descomprimiu el fitxer: nautilus-svn-scripts-0.9.2.tar.gz dins del directori ~/.gnome2/nautilus-scripts, després reinicieu el nautilus i llestos ja podeu veure el menú de contexte apretant el botó dret del ratolí, el menú és algo així:

NautilusSubversionScripts.png

MAGMA: Slot CardBus to PCI Expansion System

Reading time: 2 – 2 minutes

Molta gent usa l’ordinador portatil com a ordinador de sobretaula, però a vegades cal tenir slots PCI per poder connectar les targetes de dispositius, per exemple: capturadores de TV, targetes gràfiques més potents, etc. fa quatre dies em pensava que això no es podia fer però fent recerca d’un altre producte vaig trobar una empresa que es diu magma i que tenen uns chasis on es poden endollar targetes PCI també disposen de targetes PCMCIA que es connecten al chasis i des del portàtil ja tenim els anciats slots PCI.

magma.jpg

A part de ser una solució per portàtils també disposen de targetes PCI que permeten ampliar els slots PCI de que disposa la placa base.

Com podeu veure el chasis és molt professional, la fotografia suporta 4 PCI’s però hi ha chasis de només 1 slot.

magma2.jpg

Ara ve el dolent, el preu. Un slot PCI amb una targeta PCMCIA costa uns ~850€. Malgrat com a solució domèstica ho he descartat com a solució professional crec que val la pena no perdre de vista aquests productes.

Un dia com un altre…

Reading time: < 1 minute

o no!!!

ja són 29!!! a veure si em puc regalar un dia light, tot i que no sé si serà possible.

Per cert, moltes gràcies als molts SMS que ja he rebut només encendre el mòbil aquest matí, que no teniu son vosaltres 🙂

Poques ganes de treballar…

Reading time: 2 – 2 minutes

godspeedyoublackemperor.jpg

Suposo que és normal sent el dia que és deu ser normal que no tingui ganes de treballar. Però volia aprofitar que la Daphne no arriba fins ben tard per fer mil coses que tinc pendents. Però la veritat a vegades estas espès i no tens ganes de posar-te a fer res. És curiós perquè ni ganes de mirar una pel·lícula tens. Malgrat això he aconseguit trobar un grup que em venien ganes d’escoltar mentre escribia aquesta extranya sensació que m’omple en aquesta tarda de diumenge.

Es tracta de Godspeed you! Black Emperor fa molt de temps que tinc música d’aquest grup, el vaig descobrir gràcies a l’Aurora una de les germanes de la Daphne i de veritat que fan una música molt especial no sabria ni per on començar a descriure-la. Això si és capaç de fer-te sentir coses molt especials. Et fa submergir per sota l’aigua i de cop et fa fer un sal que t’aixeca centenars de metres fins a barrejar-te en els núvols i notes com vas planejant pel cel.

Ja ho sabeu doncs, una bona tearapia per dies grisos i solitaris com aquest diumenge. A vegades no saps què és el que més t’agobia si que sigui diumenge o que demà hagis d’anar a treballar perquè és dilluns així doncs potser millor no pensar-hi, millor oblidar les dues coses i només buscar alguna cosa que et faci sentir viu!!!

i 3!!!!

Reading time: < 1 minute

Apa ja són tres!!! si nois si… ja va tres anys que vaig tornar a neixer. Així doncs avui és el meu segon aniversari que sempre es dona dos dies abans que el meu primer aniversari… hi hi hi! enrabassat eh!!!

pastis.gif

Per no perdre la costum, aquí teniu l’enllaç del fet que em va fer re-eneixer. Ara com ja dic cada any el que toca és no oblidar la sort que tinc i el bé que em va tot. Així que A VIURE!!!

Scroll to Top