dijous, 27 de juny de 2013

Invertir incrementa la productivitat?

De vegades, pareix que invertir és cremar diners, sobretot si observem a l'empresariat "patri". Ja duc diversos dies fent proves, cavil·legant, investigant... En el tema de fer desenvolupaments multiplataforma. La idea més fàcil, baixar-se el sdk de cada plataforma (sol ser gratuït) i ala, a la marxeta. Parlant de mòvils: BB, WP, IOS, Android sense comptar versions. Damunt cada versió té el seu llenguatge de programació (C++,C#-VB,Objective C, Java), encara què són prou pareguts. És a dir que estariem parlant de 4 entorns en 4 (o més) llenguatges de programació. Crec que unificar un programa amb eixos criteris podria ser un esforç massa gran, inclús per als que no ens dediquem professionalment a açò (almenys no de moment). Mirant alternatives, he trobat diverses, sobretot amb diferents preus:

Phonegap

 http://phonegap.com/
Gratuït, però només treballa amb interfícies

Xamarin

http://xamarin.com
pots fer aplicacions simples gratis amb C#, per a IOS i Android. Hi ha versions més completes per 300$ cada plataforma.

Unity

http://unity3d.com/
Exclusivament per a jocs, 1500$ per plataforma, pràcticament per a qualsevol plataforma. Si volem escriptori, android, ios serien 4500$. Suposant BB i WP que estan en fase beta, serien 7500$. Seria una inversió molt important per a un programador freelance.

XNA

http://www.monogame.net/
http://msdn.microsoft.com/en-us/centrum-xna.aspx

Actualment mort, creat per microsoft.Principalment per a jocs. Incialment creat per a plataformes.NET ara continuat mitjançant MonoGame per a quasi totes les plataformes (juntament amb Xamarin per a ios i android). Pots acabar fent aplicaicons per a pràcticament totes les platafomes.

Marmalade

http://www.madewithmarmalade.com/
La versió per a totes les plataformes són 1500$ a l'any. És de les poques què inclou BB.


De moment vaig a provart la versión XNA+Monogame+Xamarin gratuïta, si em convenç adquiriré llicència, que no tinc res en contra de pagar per serveis que són útils. Anem a fer càlculs, què és al que anava al principi de l'article, imaginem què vull fer un joc per a les 4 plataformes d'abans. Imaginem que costa, aproximadametn 2 mesos de fer en cada plataforma. Això faria un total de 8 mesos. En canvi fer l'aplicació per un framework que et fa la feina, serien 2-3 mesos. Caldira veure si la diferència de mesos (en sou) equival al que pagues de llicència pels programes. Per exemple, el cas de Xamarin em 300$ per plataforma, cap programador cobraria 300$ per un treball de 2 mesos. A més, la llicència ja la tindries per als propers desenvolupaments, així que només en un projecte ja estaria més que amortitzada.
Els empressaris són reacis a fer este tipus d'inversions, però crec que he demostrat, més que de sobra, que incrementaria, i en molt, els beneficis.







dimarts, 18 de juny de 2013

Nova aplicació: Club Taekwondo La Safor

A la espera de que em deixen drets per a públicar dades i  utilitzar logos del Club de Taekwondo al que pertany,
Simplement és un lector de Atom, que he enllaçat al blog del club (http://taekwondolasafor.blogspot.com.es). Bàsicament he realitzat una xorrada de classe lectora, que explicaré en un post posterior, i he posat un component webbrowser que llig del que li passa la classe lectora de Atom, Canviant-li els logos, el  fons, i un línia de codi (la url del blog), es podria fer per a qualsevol Atom.

dijous, 13 de juny de 2013

Passant POST i GET paràmetres en windows phone

Un dels problemes principals quan accedim a urls és passar paràmetres amb GET i POST. No és molt complicat, però pots tirar-te uns quants dies buscant informació si tens la mala sort que tinc jo ;).
Primer ja hem treballat amb GET, és la forma "normal" amb que hem treballat en anteriors posts, simplement amb un webclient i  esperar l'arxiu de manera asíncrona, per a passar par1, par2... per get els afegirem a la url que obrim:


            WebClient wc = new WebClient();
            wc.DownloadStringCompleted += HttpCompleted; //funció que es cridarà quan es connecte l'event
            wc.DownloadStringAsync(new Uri("http://url?par1=valor1&par2=valor2"));



 private void HttpCompleted(object sender, DownloadStringCompletedEventArgs e)
        {

            if (e.Error == null)
            {
                  //en e.Result tindrem l'arxiu com a cadena de text
             }
       }



El problema és que si volem fer-ho per POST o si volem afegir cookies ho haurem de fer d'una altra manera, ho haurem de fer amb webrequest, i necessitarem capturar dos "events", l'inici de la descàrrega i inici de l'stream de dades dades POST, i veurem un allDone que del que parlarem després: 

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(sTuentiURLLogin);
            request.ContentType = "application/x-www-form-urlencoded";
            request.Method = "POST";
            request.BeginGetRequestStream(new AsyncCallback(BGRS), request);


 private static void BGRS(IAsyncResult asynchronousResult)
         {
             HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;

            //Final de l'stream de dades post:
             Stream postStream = request.EndGetRequestStream(asynchronousResult); 

            //que volem enviar:
             string postData = "par1=valor1&par2=valor2";
             byte[] byteArray = Encoding.UTF8.GetBytes(postData);
             postStream.Write(byteArray, 0, postData.Length);
             postStream.Close();

            //esperem la resposta asíncronament:
             request.BeginGetResponse(new AsyncCallback(BGR), request);
             allDone.WaitOne();

         }

 private static void BGR(IAsyncResult asynchronousResult)
        {
             HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
             HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
             Stream streamResponse = response.GetResponseStream();
             StreamReader streamRead = new StreamReader(streamResponse);           

              //en responseeString tindrem el Resultat final
              string responseString = streamRead.ReadToEnd();
      }


Sí voleu saber com funciona internament, simplement llegiu un poc els comentaris que he posat, tampoc té molta dificutat, el mètode BGRS, envia el POST asíncronament, i l'arreplega asíncronament el mètode BGR. Per últim ens faltaria afeir un:

 Private static ManualResetEvent allDone = new ManualResetEvent(false);

per a fer el allDone.WaitOne(), el que fa el mètode és esperar (bloquejar-se) fins que aplega un senyal (descàrrega).

Si vulguerem enviar cookies, seria molt senzill amb un element:

   static private CookieContainer CC = new CookieContainer(); 

en la primera petició, afegirem el codi:

request.CookieContainer = CC;

I així podrem arreplegar les cookies de tornada, si el que vulguerem és enviarla:
Cookie cook = new Cookie("email", "fercavi666@gmail.com", "/", ".gmail.com");
CC.Add(new Uri("http://www.google.com"),cook);

siguent: email la "clau", "fercavi666@gmail.com", el valor, "/" la ruta i ".gmail.com" el domini.

dimecres, 12 de juny de 2013

XNA: el perquè de tot plegat

Parafrassejant el títol del mestre Monzó, duc uns dies pegant-li voltes a una cosa, la idea de fer un joc. No tinc massa temps, i estic fent massa coses a l'hora, però m'apasiona la idea d'un joc multiplataforma. Mai de la vida havia programat videojocs, la veritat, mai m'havia agradat. Però ara em pica el cuquet. Però bé com a introducció personal ja n'hi ha prou. He estat mirant, i vaig a provar amb XNA. El què més m'ha agradat és que el mateix codi (repetisc, el mateix codi), val per fer fer programes(jocs) en:
-Windows phone
-Windows
-XBOX

Anem a fer una demostració (basada en les tutorials de RB Whitaker):


Instal·lem el VS2010 (podem fer-ho amb la versió express, gratuita), i després del SP1, ens baixem i instal·lem el XNA. Una vegada instal·lat podrem elegir quin tipus de projecte volem:


Com no tenim (jo almenys) una XBOX, ens haurem de conformar amb un Microsoft Game ;)

Veurem que tenim una classe Game1, dins d'un namespace windowsGame2 (que deuriem de canviar en desenvolupaments seriosos). Anem a posar un fons de pantalla, afegim com a variable de classe:
private Texture2D background;
Ara afegirem al projecte, l'arxiu a carregarm el meu cas, el mural que va pintar la meua princesa, Content->Botó dret->Afegir element existent
Tornem al codi,  i busquem l'event LoadContent. En este event és on s'ha de fer la càrrega de les textures de tot el joc. Ahí afegirem la línia
  background = Content.Load<Texture2D>("mural");
és a dir que la variable background, carregarà una textura2d, bassant-se en el objecte mural de la secció Content (contingut). Si ens fixem, davant hi ha una línia que diu
spriteBatch = new SpriteBatch(GraphicsDevice);
la vairaible spriteBatch farà de finestra on dibuixarem tot.
Per últim ens quedarà dibuixar-ho. En l'event Draw, afegim el següent codi:

            spriteBatch.Begin();//comença a dibuixar
            spriteBatch.Draw(background, new Rectangle(0, 0, 800, 480), Color.White);
            spriteBatch.End(); //acaba

la línia central, és la interessant, dibuixa la textura background (l'hem carregada en l'event Load), com a posició inicial el centre de la pantalla, posem blanc, per què algun color s'havia de posar ;), executem i:






 Ara anem a provar si amb el mateix codi podem fer-ho per a windows phone, no vaig a explicar els motius però el XNA actualment només el tinc configurat en el VS 2012, per a la versió 8 de windows phone. En canvi el XNA per a ordinador, el tinc per a la versió VS 2010.
Ara afegirem la textura mural igual que hem fet abans:
i ara copiem i peguem el codi anterior, arranquem, esperem que arranque l'emulador, i veurem com carrega la imatge