Follow me @Tmeister

Archive for October, 2006

Desktoptwo Update

Posted by Tmeister On October - 26 - 2006

[English]

After hard work weeks, we finally got new applications online in Desktoptwo; all of them under a beta status. These new applications are:

RSS Reader
Bookmarks (MySitesTwo)
Forums
Chat

Also, some bugs were killed on the other applications

All new and previews applications are:

HardDrive
Email Client
Address Book
Blog
Message Board
RSS Reader
My SitesTwo
IM
MP3 Player
Live Chat
My Website Editor
y la suite OpenOfficce 2

And of course our “reloaded” home page

Hope you enjoy all new applications, if you’ve not already signed up remember the service is “free as in beer” :) Desktoptwo

[Español]

Después de unas semanas se arduo trabajo por fin se hizo un release de nuevas aplicaciones en Desktoptwo todas ellas en versión Beta, entre las nuevas aplicaciones se encuentran:

RSS Reader
Bookmarks (MySitesTwo)
Forums
Chat

En lo que respecta a las aplicaciones existentes se corrigieron varios bugs.

El listado completo de aplicaciones en linea al día de hoy es :

HardDrive
Email Client
Address Book
Blog
Message Board
RSS Reader
My SitesTwo
IM
MP3 Player
Live Chat
My Website Editor
y la suite OpenOfficce 2

Me olvidaba del nuevo look de la pagina hogar totalmente rediseñado.

Espero que las nuevas aplicaciones sean de su agrado, si no están registrados al servicio les recuerdo que el alta es gratis. :) Desktoptwo

Uncategorized

Clase Config (Parsear archivos de configuración)

Posted by Tmeister On October - 14 - 2006

En muchas ocasiones cuando se nos encarga una aplicación dinámica en flash siempre hay un problema al momento de que el cliente cambie los valores de configuración de dicha aplicación mucho mas cuando este ultimo no quiere pagar por una interfaz de configuración =).

Para nosotros como desarrolladores no es nada del otro mundo poder cambiar los valores de un XML pero esto cambia cuando el cliente final sera el encargado de modificar dicho archivo. Cuando decimos XML se quedan con cara de ‘ehhh? Y eso con que se come’, repito si el cliente no quiere pagar por una interfaz de administración y quiere poder cambiar algunos valores de la aplicación lo mejor es que se le de un archivo de configuración en texto plano.

Ustedes pensaran que para ello podemos usar loadVars con las variables declaradas, el problema, de nuevo desde el punto de vista del cliente final es complicado ya que este debe tener un formato y ademas de que no podemos poner comentarios en el.

Jugando por ahí con Python me encontré con el modulo Config que carga y parsea un archivo de configuración estándar. A que me refiero con archivo de configuración estándar?

El típico archivo que utilizan los programas en linux, por ejemplo apache. Si nunca han visto este tipo de archivos así es como se ve.

###########################################
### This is a sample of a Config file config.txt
### Author: Enrique Chavez aka Tmeister
### Site: http:www.klr20mg.com
### Date: Oct, 14 2006
###########################################

###########################################
### The images path
###########################################

pathImages path/to/folder/

###########################################
### The gallery’s name
###########################################

GalleryName this is my test gallery

###########################################
### Your Firstname
###########################################

firstname = Enrique

###########################################
###Your Lastname
###########################################

lastname Chavez

###########################################
###Your Nick =)
###########################################

nick Tmeister

# End File

Bueno, He creado una sencilla clase que se encarga de parsear este tipo de archivos pudiendo acceder a los valores de las variables de una forma simple.

Tomando como ejemplo el archivo de configuración anterior, lo único que tenemos que hacer en nuestra clase o Fla es algo así..

[as]
import org.utils.Config
import mx.utils.Delegate
class myApp extends MovieClip
{
private var config : Config;
function myApp ()
{
}
function onLoad ()
{
config = new Config (“config.txt”);
config.addEventListener (“fault”, Delegate.create (this, onFault));
config.addEventListener (“complete”, Delegate.create (this, onComplete));
}
private function onComplete (obj : Object)
{
trace (config.read (“pathImages”))
for (var i in config.list)
{
trace (‘key: ‘ + i + ‘, value: ‘ + config.list [i]);
}
}
private function onFault (obj : Object)
{
for (var i in obj) trace (‘key: ‘ + i + ‘, value: ‘ + obj [i]);
}
}
[/as]

Con esto obtenemos algo así:

path/to/folder/
key: nick, value: Tmeister
key: lastname, value: Chavez
key: firstname, value: Enrique
key: GalleryName, value: this is my test gallery
key: pathImages, value: path/to/folder/

Como pueden ver al instaciar la clase se le pasa como parámetro el path del archivo de configuración. Esta clase cuenta con 2 dispatchs, fault y complete los nombres son mas que descriptivos cierto? :)
Por ultimo hay 2 métodos

read que regresa el valor de la variable que se pasa como parámetro y
list que regresa un objeto con todas las variables del archivo de configuración

Por ultimo la clase Config

[as]
import mx.events.EventDispatcher;
import mx.utils.Delegate
[Event("complete")]
[Event("fault")]
class org.utils.Config
{
private var cfgFile : String
private var cfg_lv : LoadVars
public var addEventListener : Function
private var dispatchEvent : Function;
private var token : Object
public var configList : Object
public function Config (getFile : String)
{
EventDispatcher.initialize (this);
cfgFile = getFile;
loadConfig ();
}
private function loadConfig ()
{
cfg_lv = new LoadVars ();
cfg_lv.load (cfgFile);
cfg_lv.onLoad = Delegate.create (this, parseCfg);
}
private function parseCfg (ok)
{
if ( ! ok)
{
dispatchEvent (
{
type : “fault”, msg : “Cant load file ” + cfgFile
});
return
}
var data : String = unescape (cfg_lv.toString ())
data = data.split (“=&onLoad=[type Function]“).join (“”)
data = data.split (“&onLoad=[type Function]“).join (“”)
var lines : Array = data.split (“\n”)
var count : Number = 0;
token = {
};
configList = {
}
while (lines [count])
{
var actualLine = lines [count ++]
var firstCharacter : String = escape (actualLine.substr (0, 1));
if (firstCharacter != “%23″ && firstCharacter != “%0D” && firstCharacter != ” “)
{
var finalLine = actualLine.split (“\r”).join (“”)
var values : Array = finalLine.split (” “);
var finalValue : String = “”;
for (var i : Number = 1; i < values.length; i ++)
{
finalValue += values [i] + " ";
}
finalValue = finalValue.substr (0, - 1)
token [values [0]] = finalValue
configList [values [0]] = finalValue
}
}
dispatchEvent (
{
type : "complete"
});
}
public function read (variable : String) : String
{
return token [variable]
}
public function get list () : Object
{
return configList;
}
}
[/as]

Los archivos Fuente. http://klr20mg.com/archivos/config.zip

Estoy totalmente convencido que la mejor manera para manejar nuestras configuraciones en Flash sigue y seguirá siendo un archivo XML, pero para aquellos necesiten un archivo de texto plano que sirva como archivo de configuración simple con comentarios para los clientes necios jeje esta clase puede ser de utilidad.

Saludos!!

[Flex 2.0] TraceTarget

Posted by Tmeister On October - 2 - 2006

Últimamente he estado probando Flex. Estoy realizando una vista en Flex de este blog que pronto podrán ver en linea entre otras cosas..

Bien, El tema de hoy va sobre la etiqueta esta etiqueta al momento de debuguear tu aplicación es de gran ayuda, por ejemplo, digamos que queremos consumir un webServices remoto, algo simple tomar la “Cita del día”.

Cuando agregamos esta etiqueta a nuestro mxml regresa una secuencia detallada de los eventos que se están ejecutando en nuestra aplicación. Como es un tag para debuguear en nuestra aplicación final no se vera ningún cambio.

El ejemplo es sencillo

[as]



import mx.events.*
import flash.xml.XMLDocument
public function init():void
{
miConexion.GetQuote.send()
}
public function onResultOK(event:Event):void
{
var data:XMLDocument = new XMLDocument();
data.parseXML(miConexion.GetQuote.lastResult);
var out:String = data.firstChild.firstChild.firstChild.firstChild.nodeValue
outPut.text = out

}
public function onResultFault(fault:Event):void
{
trace(fault)
}
]]>







[/as]

así es como se ve nuestra ventana de debugeo si dicha etiqueta

[as]
[SWF] C:\Documents and Settings\Tmeist3r\Desktop\test\bin\test-debug.swf – 730,596 bytes after decompression
[/as]

Ahora, así es como se ve nuestra ventana de debugueo cuando utilizamos TraceTarget

[as]
[SWF] C:\Documents and Settings\Tmeist3r\Desktop\test\bin\test-debug.swf – 717,747 bytes after decompression
Registering schema namespace: http://www.w3.org/1999/XMLSchema
Registering schema namespace: http://www.w3.org/2000/10/XMLSchema
Registering schema namespace: http://www.w3.org/2001/XMLSchema
Registering schema namespace: http://schemas.xmlsoap.org/soap/encoding/
Registering schema namespace: http://xml.apache.org/xml-soap
Registering schema namespace: http://rpc.xml.coldfusion
’0E6C71D7-0670-186D-74DB-0B47A9E33F2A’ producer set destination to ‘DefaultHTTP’.
’9828CAB5-C669-81AC-3299-0B47AA9F2817′ producer set destination to ‘DefaultHTTP’.
‘direct_http_channel’ channel endpoint set to http:
Creating WSDL object for http://www.swanandmokashi.com/HomePage/WebServices/QuoteOfTheDay.asmx?WSDL
’127766B4-8379-1647-CADD-0B47AA9FB309′ producer set destination to ‘DefaultHTTP’.
Loading document http://www.swanandmokashi.com/HomePage/WebServices/QuoteOfTheDay.asmx?WSDL for destination ‘DefaultHTTP’
’0E6C71D7-0670-186D-74DB-0B47A9E33F2A’ producer sending message ’5604ADC7-4155-F995-8E77-0B47AA9F7C90′
‘direct_http_channel’ channel sending message:
(mx.messaging.messages::HTTPRequestMessage)#0
body = (Object)#1
clientId = (null)
contentType = “application/x-www-form-urlencoded”
destination = “DefaultHTTP”
headers = (Object)#2
httpHeaders = (Object)#3
messageId = “5604ADC7-4155-F995-8E77-0B47AA9F7C90″
method = “GET”
recordHeaders = false
timestamp = 0
timeToLive = 0
url = “http://www.swanandmokashi.com/HomePage/WebServices/QuoteOfTheDay.asmx?WSDL”
’0E6C71D7-0670-186D-74DB-0B47A9E33F2A’ producer connected.
Queueing SOAP operation GetQuote
’0E6C71D7-0670-186D-74DB-0B47A9E33F2A’ producer acknowledge of ’5604ADC7-4155-F995-8E77-0B47AA9F7C90′.
Processing imports for location http://www.swanandmokashi.com/HomePage/WebServices/QuoteOfTheDay.asmx?WSDL
Parsing schemas
Registering schema namespace: http://swanandmokashi.com
Done parsing schemas: 3 ms
Done processing imports: 581 ms
Parsing services
Parsing individual services
Parsing service: QuoteofTheDay
Parsing binding: http://swanandmokashi.com::QuoteofTheDaySoap
Parsing portType: http://swanandmokashi.com::QuoteofTheDaySoap
Parsed portType: 1 ms
Parsed binding: 6 ms
Parsed service: 11 ms
Done parsing services: 12 ms
WSDL parse took 594 ms
WSDL loaded
Made SOAP Operation for GetQuote
Set active port in service stub: QuoteofTheDay:QuoteofTheDaySoap
Invoking previously queued calls GetQuote
Invoking SOAP operation GetQuote
Initializing SOAP operation GetQuote
Parsing message: http://swanandmokashi.com::GetQuoteSoapIn
Message name is GetQuoteSoapIn
Parsed message: 5 ms
Parsing message: http://swanandmokashi.com::GetQuoteSoapOut
Message name is GetQuoteSoapOut
Parsed message: 5 ms
Asynchronously invoking SOAP Operation: GetQuote
Encoding SOAP request envelope
Encoding SOAP request body
Encoded SOAP Operation request:

’0E6C71D7-0670-186D-74DB-0B47A9E33F2A’ producer sending message ‘E5E1E227-8114-3417-14DB-0B47AD103D57′
‘direct_http_channel’ channel sending message:
(mx.messaging.messages::SOAPMessage)#0
body = “

clientId = “DirectHTTPChannel0″
contentType = “text/xml; charset=utf-8″
destination = “DefaultHTTP”
headers = (Object)#1
httpHeaders = (Object)#2
SOAPAction = “”http://swanandmokashi.com/GetQuote”"
messageId = “E5E1E227-8114-3417-14DB-0B47AD103D57″
method = “POST”
recordHeaders = false
timestamp = 0
timeToLive = 0
url = “http://www.swanandmokashi.com/HomePage/WebServices/QuoteOfTheDay.asmx”
’0E6C71D7-0670-186D-74DB-0B47A9E33F2A’ producer acknowledge of ‘E5E1E227-8114-3417-14DB-0B47AD103D57′.
Decoding SOAP response
Encoded SOAP response: All I Really Need To Know I Learned In KindergartenRobert Fulghum
Decoding SOAP response envelope
Decoded SOAP response into result [0 millis]
[/as]

Sin duda esta es una etiqueta que nos puede ahorrar muchos dolores de cabeza al momento de Debugear.

[FLASH]http://klr20mg.com/flex/tracetarget/trace.swf,350,100[/FLASH]

Saludos!!

Acerca de mi
Enrique Chavez

Enrique Chávez también es conocido como @Tmeister es un desarrollador, emprendedor, poeta y loco.

Geek autodeclarado y apasionado de todo lo que tiene que ver con tecnología y desarrollo.

Cuenta con una experiencia de más de 7 años en el ramo del desarrollo, creando, sobre todo, aplicaciones web en la empresa Sapotek.

A finales del 2008 crea, junto con 3 colegas, la consultoría llamada AureaCode, enfocándose a brindar servicios de desarrollo web en todas sus variantes.

Si necesitas algún tipo de información o consulta por favor no dude en escribir.

View Enrique Chávez's profile on LinkedIn

Carlos Enrique Chavez Garcia's VisualCV

RSS Feed

Links Patrocinados