Matteo Monti, Professional web application developer in Barcelona. Specialist in Adobe Flash platform

AS3 System.useCodePage affects URLVariables encoding

Dec 14

I've been struggling today with encoding.

It seems that System.useCodePage affects the encoding of URLVariables during a URLRequest

Actionscript:
  1. package {
  2.     import flash.display.Sprite;
  3.     import flash.events.Event;
  4.     import flash.events.IOErrorEvent;
  5.     import flash.events.SecurityErrorEvent;
  6.     import flash.net.URLLoader;
  7.     import flash.net.URLRequest;
  8.     import flash.net.URLRequestMethod;
  9.     import flash.net.URLVariables;
  10.     import flash.system.System;
  11.  
  12.     /**
  13.      * @author Matteo Monti
  14.      */
  15.     public class Main extends Sprite {
  16.         public function Main() {
  17.            
  18.             System.useCodePage = true;
  19.             send();
  20.             System.useCodePage = false;
  21.             send();
  22.  
  23.         }
  24.        
  25.         private function send() : void {
  26.             trace("send System.useCodePage: " + System.useCodePage);
  27.            
  28.             // setup variables
  29.             var urlvar : URLVariables = new URLVariables();
  30.                 urlvar.somedata = "Ñoña çáà System.useCodePage: " + System.useCodePage;
  31.                
  32.                 // instance request
  33.                 var request : URLRequest = new URLRequest();
  34.                     request.url = "http://www.myserver.com/service";
  35.                     request.data = urlvar;
  36.                     request.method = URLRequestMethod.GET;
  37.                    
  38.                 // instance urlloader      
  39.                 var loader : URLLoader = new URLLoader();
  40.                     loader.addEventListener(Event.COMPLETE, onResponse);
  41.                     loader.addEventListener(IOErrorEvent.IO_ERROR, onXMLIoErrorHandler);               
  42.                     loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityErrorHandler);     
  43.                     loader.load(request);         
  44.         }
  45.        
  46.         private function onSecurityErrorHandler(event : SecurityErrorEvent) : void {
  47.             trace("onSecurityErrorHandler");
  48.         }
  49.  
  50.         private function onXMLIoErrorHandler(event : IOErrorEvent) : void {
  51.             trace("onXMLIoErrorHandler");
  52.         }
  53.  
  54.         private function onResponse(event : Event) : void {
  55.             trace("onResponse System.useCodePage: " + System.useCodePage);
  56.             trace(event.target.data);
  57.         }
  58.  
  59.  
  60.     }
  61. }

Translate Existing Flash Applications

Dec 13

I've been encharged to translate three existing games for disney from english to italian.
It's quite a pain in the ass enter in other's people applications especially games.

Here's a nice jsfl command that will help you when translating old AS2 aplications.
This script will:

  • convert statics to dynamics
  • apply a global variable into any textfield
  • embed fornts and

JavaScript:
  1. if(!counter){
  2. var counter = 0;
  3. }
  4.  
  5. fl.trace('// include in first frame');
  6. fl.trace('_global.texts= new Object()');
  7.  
  8. scanLibrary(fl.getDocumentDOM().library);
  9.  
  10.  
  11.  
  12. function getIsWholeInt(n)
  13. {
  14.     var s = String(n);
  15.     if(s.indexOf(".") != -1)
  16.     {
  17.         return false;
  18.     }
  19.     else
  20.     {
  21.         return true;
  22.     }
  23. }
  24.  
  25. function round(n)
  26. {
  27.     var s = String(n);
  28.     var a = s.split(".");
  29.     var num = parseInt(a[0]);
  30.     var dec = parseInt(a[1].substr(0, 1));
  31.     if(dec>= 5)
  32.     {
  33.         num++;
  34.     }
  35.     return num;
  36. }
  37.  
  38. /**
  39. * Scans the supplied flash library for linked classes and makes sure the textfields are set up properly
  40. * @param   library      A flash library to scan.
  41. */
  42. function scanLibrary(library)
  43. {
  44.     var items = library.items;
  45.     var item;
  46.     var replaceCount = 0;
  47.    
  48.     //fl.trace('items.length' + items.length);
  49.  
  50.     for( var i = 0; i <items.length; i++ )
  51.     {
  52.         item = items[i];
  53.        
  54.        
  55.        
  56.         if (item.itemType == 'movie clip' || item.itemType == 'graphic' || item.itemType == 'button')
  57.         {
  58.             var timeline = item.timeline;
  59.             var h = timeline.layerCount;
  60.            
  61.             library.selectItem(item);
  62.             library.editItem();
  63.  
  64.            
  65.             while(h--)
  66.             {
  67.            
  68.                 //fl.trace('layer' + h);
  69.  
  70.                 var k = timeline.layers[h].frameCount;
  71.                
  72.                 //fl.trace('k' + k);
  73.                
  74.                     while(k--)
  75.                     {
  76.                        
  77.                         try{
  78.                                 var j= timeline.layers[h].frames[k].elements.length;
  79.                                 //fl.trace('j' + j);
  80.  
  81.                                 while(--j>=0 )
  82.                                 {
  83.                                
  84.                                     //fl.trace('j' + j);
  85.                                    
  86.                                     var elems = timeline.layers[h].frames[k].elements;
  87.                                     var p = elems.length;
  88.                                    
  89.                                     //fl.trace('p' + p);
  90.                                    
  91.                                    
  92.                                     while(--p>=0)
  93.                                     {
  94.                                         //fl.trace('p' + p);
  95.                                         fixField(elems[p])
  96.                                     }
  97.                                    
  98.                                    
  99.                                    
  100.                                 }
  101.                             }catch(err){
  102.                            
  103.                             }
  104.                     }
  105.                
  106.             }
  107.         }
  108.     }
  109. }
  110.  
  111. function fixField(elt){
  112.    
  113.     if(elt.elementType == "text" ) {
  114.    
  115.         if(elt.textType == "static"){
  116.  
  117.             var thestr = '_global.texts.text_' + counter;
  118.            
  119.             var theValueStr = elt.getTextString();
  120.                 theValueStr = theValueStr.replace(/[\r\n]+/g, "");
  121.                
  122.             fl.trace('_global.texts.text_' + counter + ' = "NN_'+ theValueStr +'";');
  123.            
  124.             counter++;
  125.            
  126.             elt.textType = "dynamic";
  127.             elt.selectable = false;
  128.             elt.lineType = "multiline";
  129.             //elt.useDeviceFonts  = false;
  130.             elt.embedRanges = "1|2|3|4|5|17";
  131.             elt.setTextAttr('autoKern', false);
  132.             //elt.setElementProperty("fontRenderingMode", "customThicknessSharpness");
  133.             elt.variableName = thestr;
  134.            
  135.         }
  136.  
  137.     }
  138. }
  139.  
  140.  
  141. var items;
  142. var doc = fl.getDocumentDOM();
  143.  
  144. var i = 0;
  145. var curTimelines = doc.timelines;
  146. while(i <doc.timelines.length){
  147.     fl.trace('///////////////////////////////' +  curTimelines[i].name  + '//////////////////////////////////');
  148.     iterateTimeline(curTimelines[i]);
  149.     ++i;
  150. }
  151.  
  152.  
  153.  
  154. function iterateTimeline(timeline){
  155.     var layer, frame, elem, cls;
  156.     var arr  = new Array();
  157.  
  158.     // go through all frames in all layers and search for instance variables.
  159.     for( var i=0; i <timeline.layers.length; i++ )
  160.     {
  161.         layer = timeline.layers[i];
  162.         for( var j=0; j <layer.frames.length; j++ )
  163.         {
  164.             frame = layer.frames[j];
  165.             for( var k=0; k <frame.elements.length; k++ )
  166.             {
  167.                 elem = frame.elements[ k ];
  168.                
  169.                 fixField(elem);
  170.  
  171.             }
  172.         }
  173.     }
  174. }

Spotify sort playlists by the date a tune was added to the playlist

Oct 15

If you click the little blank column heading to the left of "Track" it sorts it in the order that songs were added.

From: getsatisfaction.com

Experiencia y elegancia

Oct 05

Empollandome un post de Matthew Tretter AKA Exanimo acerca de garbage collection y misticismos varios... he encontrado una forma muy elegante de eliminar un event listener que creo sea desconocida a muchos.

A continuacion el codigo..

Actionscript:
  1. private var _timer:Timer;
  2.  
  3. private function _startTimer():void
  4. {
  5.     this._myTimer = new Timer(1000, 1);
  6.  
  7.        // AÑADIR EVENT LISTENER...
  8.     this._myTimer.addEventListener(TimerEvent.TIMER, this._timerHandler);
  9.  
  10.  
  11.  
  12.     this._myTimer.start();
  13. }
  14.  
  15. private function _timerHandler(e:TimerEvent):void
  16. {
  17.      // ELIMINAR EVENT LISTENER CON ARGUMENTS CALLEE
  18.     e.currentTarget.removeEventListener(e.type, arguments.callee);
  19.  
  20.     // We're done with the timer. Let it die.
  21.     this._myTimer = null;
  22. }

código QR

Sep 29

He Creado mi código QR!!
En estas pequeñas imagenes se pueden alamcenar hasta 250 caracteres.

Puedes crear el tuyo tambien por ejemplo a través de esta pagina.
http://qrcode.kaywa.com/ la distribuidora del mas famoso reader para moviles.

He intslado beetag, para blackberry (no funciona perfectamente) lo aconsejo solo por el hecho de probar gratuitamente la experiencia.

qrcode