no és un mòbil, no és una pda… és una internet tablet
De fet, tothom quan veu el meu nou nokia 770 em pregunta el mateix. Costa definir ben bé què fa i perquè serveix el nokia 770. però la millor definició esta clar que és un internet table. Un dispositiu en linux enquestat, amb prestacions de PDA, completament orientades a la connectivitat amb internet.
De fet, no me l’he comprat ben bé, sinó que he fet un trueque amb en Jordi. O sigui, jo li he donat la meva PSP i uns quants calers i ell m’ha donat un 770 encara per obrir que tenia. Només fa unes 24h que el tinc però ja l’he fet servir ben bé unes 3 o 4h. Les impresions són molt primaries i potser el més gran defecte que hi trobo és que és un pel lent. Sobre tot passant pàgines de PDF 🙂 tot i que si desactives el bluetooth i el wireless guanya molta velocitat.
D’altre banda he de dir que estic anciós per fotre-li mà ja que promet molt i al tenir linux darrera això sempre és un alicient més. Et permet arribar més endins i tocar les coses que no t’acaben de fer el pes. De fet, ja hi ha una aplicació que vull tocar una petita cosa que no m’agrada com fa, la de llegir el bloglines.
Ara a esperar el següent capitol… a veure si no em decepciona tan com la PSP, que quan vaig veure que se’m coplicava tan la cosa per escoltar MP3 i llegir PDFs al tren em va durar ben poc. Ja que aquesta és la funció bàsica que li donaré al dispositiu.
Per aprofundir més en les característiques del dispositiu: datasheet.
I love symfony
Porto dos dies enganxat al Zend Studio programant en PHP5, concretament amb el framework anomenat symfony. Doncs bé no tinc cap ganes de posar-me a escriure un article tècnic sobre aquests dos aplicatius i menys a entrar en detall en la potencia d’ambdues eines juntes. Però si que volia deixar constància que això no té res que veure amb la programació de PHP que feia fa uns anys amb el PHP3. Això si que és un plaer, classes, object factories, ADO amb Abstract Factory Design, debugger, SOAP… i un llarg etcetera que no s’acaba mai.
Realment si quan heu de programar us agrada tenir eines com deu mana al vostre abast, jo diria que aquest és el duo perfecte. Si a més podeu tenir un servidor amb apache2 i el Zend Studio Server instal·lat, un control de versions amb subversion, una gestió de tasques amb taskspro i un sistema de tiqueting i roadmap amb trac jo diria que ja no es pot demanar gran cosa més.
L’últim comentari al tema abans de plegar per avui, la curva d’aprenentage del symfony és força llarga, a més interioritzar el model MVC i la implmentació basada en mojavi que en fa symfony costa lo seu. Però després passes a una nova dimenció, m’ha costat arribari però ara em declaro un enamorat del symfony.
Trick: xml2yaml
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
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:
- Changes to Functionality in Microsoft Windows XP Service Pack 2Part 2: Network Protection Technologies (local)
- How to determine and recover from Winsock2 corruption (local)
Review del Dell Latitude X300
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)
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>