diumenge, 16 de desembre de 2012

Naix: Plataformesdigitals.cat

Doncs hauria de titular-ho he estat ocupat (II), però bé...
He estat prou liat els darrer mesos, en temes personals i en un nou projecte:
www.plataformesdigitals.cat, de moment només funciona el moodle(http://moodle.plataformesdigitals.cat):
i el webmail (webmail.plataformesdigitals.cat):

La idea és oferir hosting gratuït de productes web ja existents (per evitar ús fraudulents) : moodle, webmail... bàsic, i oferir low cost un producte més complet. Per exemple: si vols un curs moodle per a tu, només has de registrar-te al moodle i enviar un mail a info@plataformesdigitals.cat diguent qui eres, de què vols el curs i a quina categoria pertany. En canvi , si vols un moodle complet per a tu sol (pels motius que siguen), ja et costarà passar per caixa ;)


Tot açò pareix sencill de muntar... per què en l'actualitat existeixen panells (CPANEL, PLESK...) que t'ho fan tot, però he de dir que ho he fet de 0, i per tant no ha sigut tant fàcil i ha segut un repte, ja que mai havia fet una cosa semblant. Però bé ara ja té color la cosa i aniré cobinant el portal amb el blog ;)

divendres, 16 de novembre de 2012

He estat ocupat ;)

He estat ocupat ;)  Ja tinc el blog un poc abandonat per què he estat inmers en dos projectes personals, un dels quals relatarè ara. M'he fet una configuració multimonitor per a jugar, ui, volia dir treballar ;). Després de barallar-me en cables, adaptadors i amb el catalyst/eyefinity ho he aconseguit: el resultat ha sigut aquest:
Fa goig i enveja, eh? Doncs no tot ha segut tant fàcil ;) El primer que vaig fer va ser comprar 3 monitors concretament el model Packar Bell Viseo 230 WS. No per res especial, si no per què el preu, poc menys de 100€ era molt temptador per a un monitor de 23". Té uns quants defectes... no té LED, ni 3D... Però mai he segut molt primmirat per a eixes coses, de fet no sóc capàs de diferenciar un monitor actual de bona qualitat de un de dolent (parlant de la imatge, clar). Una altra cosa en contra era què només tenien eixides VGA. Mirant gent que ja havia fet les investigacions per mi (si la feina ja està feta, no cal tornar-la a fer), vaig llegir proves que "demostraven" què VGA i DVI en la pràctica no teninen massa diferència. Proves cegues amb tercers inclosos que no tenien res a veure i no notaven cap diferència; per tant eixa "problema" no era tal. L'altre problema era la meua gràfica, que ja he parlat d'ella en algunes ocasions ;) Tenia 4 eixides: 2xDVI, 1xHDMI i 1x Display Port, DP (jo tampoc sabia que això existia). El problema de l'eyefinitiy d'ATI és què si vols gastar 3 pantalles o més, només 2 no poden ser DP. És a dir que havia de gastar el DP precís. Vaig haver de gastar 3 adaptadors (recordem que els monitors són només VGA) dos DVITOVGA i 1 DPTOVGA(el cable ditxós val 20€):
I este es el resultat final. Val a dir que trobar el cable DP m'ha costat prou de temps i 3 intents, primer MiniDVIToVGA, després MiniDPTOVGA i finalment DPTOVGA.
Veure'm si el meu crossfire ho suporta ;)

dimecres, 24 d’octubre de 2012

L'esquema de l'aplicació a realitzar

Estic remodelant el meu escriptori com ja comentava en articles anteriors. La veritat, poques coses m'agraden més que la informàtica, seguit de prop, per les arts marcials. M'agrada tant el hardware com el software, i m'agrada fer experiments en ambdós coses. Tot i això he trobat una mica de temps per fer el que serà l'esquema que tenia en ment de l'aplicació, per a diferents platafornes mòvils. Accedir al "servei web" creat en un altre post. Per començar he creat la versió d'escriptori. He triat fer-ho en delphi, per que feia temps que no el tocava. He posat un botó per fer les accions, un grid (TStringGrid) o im XMLDocument (TXMLDocument):




Les accions les executarem en apretar el botó (més que res està posat per facilitar el debug). Tampoc he posat nom convenient als components ni res, per què total hi havien quatre i no era massa difícil distingir-los. Ni tampoc he triat una conversió molt elegant de l'XML al grid, ho he fet a mà. Pot ser, i només pot ser, la solució elegant havera segut passar-ho a un ClientDataSet i d'ahí a un DBGrid, però fer-ho així ara em costaria més el fregall que l'escurada.
El procediment que he triat és el següent:
1. Obric l'arxiu
2. Prepare el Grid: capçalera, nombre de files...
3. Navegue per l'estructura de l'xml fins arribar a l'arbre de  de personatges
4. Una vegada arribat, vaig posant en cada fila el contingut de cada node personatge

Recordem que l'estructura de l'xml era:
<xml> 
    <resposta>
        <personatges>
           <personatge>
               <id>1</id>
               <nom>Ruper</nom>
               <classe>Mag</classe>
               <nivell>10</nivell>
           </personatge>
          .... 
         </personatges>
    </resposta>
 </xml>

Ara anem al codi font:

1. Obrir l'arxiu:
          XMLDocument1.LoadFromFile('http://localhost:1000');
Simple, eh?
2. Preparar el Grid:
           i:=1; //Comptador de files
          StringGrid1.ColCount:=4;
           //Cells[Columna,Fila], ho fan a l'inrevés
           StringGrid1.Cells[0,0]:='id';
           StringGrid1.Cells[1,0]:='nom';
          StringGrid1.Cells[2,0]:='classe';
          StringGrid1.Cells[3,0]:='nivell';
3. Navegar per situar-se en el node de personatges:
       _ixmlNode:= XMLDocument1.DocumentElement;//xml
       _ixmlNode:=_ixmlNode.ChildNodes.First; //resposta
       _ixmlNode:=_ixmlNode.ChildNodes.First; //personatges
        //posem una fila per cada més una de    capçalera
       StringGrid1.RowCount:= _ixmlNode.ChildNodes.Count+1;
       _ixmlNode:=_ixmlNode.ChildNodes.First; //El primer personatge
4.Naveguem per tots els personatges, i posem els valors corresponents al GRid:
     repeat
       StringGrid1.Cells[0,i]:=_ixmlNOde.ChildValues['id'];
       StringGrid1.Cells[1,i]:=_ixmlNOde.ChildValues['nom'];
       StringGrid1.Cells[2,i]:=_ixmlNOde.ChildValues['classe'];
       StringGrid1.Cells[3,i]:=_ixmlNOde.ChildValues['nivell'];
       _ixmlNode:=_ixmlNode.NextSibling(); //visite el següent node
       inc(i);
     until (_ixmlNode=nil)


Per tal de facilitar la comprensió, posaré tot el codi font de l'event de fer click:


I ací teniu el resultat en apretar el botó (recordeu que el servidor creat anteriorment amb el node.js deuria d'estar en marxa):


dimecres, 10 d’octubre de 2012

Remodelació de l'escriptori

El lloc de treball és tant important com la resta de factors a l'hora de millorar la productivitat. És per això que tinc el bloc una mica abandonat, estic d'obres, estic remodelant el meu escriptori. De moment  ja pareix un lloc professional , i això que encara no és tot ;) Promet pujar fotos i especificacions una vegada estiga complet ;)

divendres, 5 d’octubre de 2012

Més nou o més car no significa millor

Ja du dies pegant-li voltes a fer una remodelació del meu escriptori, és un ordinador de febrer del 2010 que em vaig muntar a peces. Havia pensat canviar les meues gràfiques:

Havia pensat en comprar-me una super model, crec que m'explique bé. Comence a mirar benchmarks i m'he quedat bocabadat. Resulta que eixes dos targetes són ATI HD 5850. Òbviament, ja estan descatalogades. El model superior 6850, també descatalogat, rendeix aproximadament la meitat (és a dir que necessitaria 4 targetes i canviar la placa base per a tindre el mateix rendiment).  De diners, de moment no anem a parlar. Aleshores em plantetge que em va costar : 230€ la primera i uns 100€ la segona refurbished. 330€. Anem a veure que tenim ara per 330€. Primera aproximació, dos de la (en teoria ) actualització d'esta versió, la 7850, costarien uns 380€. La millora teòrica és entre un 5 i un 20%. En la pràctica, especialment en jocs, si gastem DX9/10 és menys d'un 5% i DX11 si qeu arriba al 20%. De moment, esta opció queda descartada (gastar-me 200€, si aconseguira col·locar de segona mà les velles per 90€). Una altra opció és una de les més potents: 7950 (uns 300€) o una 7970 (uns 400€), totes amdós em donarien amb una targeta un rendiment similar a les dos que ja tinc, només en jocs en directx11 (tenint en compte que com a molt jugaré una hora al mes, i últimament ni això, i no no sé quin serà el proper joc...)... Val, això podria deure's a què les targetes han eixit malament (les noves versions, la veritat és que la millor generació ha segut la 5XXX). El problema rau, en que si mire d'actualitzar el processador tinc pràcticament el mateix problema, tinc un AMD Phenom IIx4 965. Ara podria augmentar-lo a un x6 (6 nuclis) però si en aplicacions ja em fa prou fluid, en jocs, que jo sàpia, cap fa ús dels 4 que té, per tant tampoc no notaria la millora. I com a nota curiosa, el hardware que tinc és de febrer del 2010 i en octubre del 2012 què siga difícil d'actualitzar (no per noves versions sino per rendiment)... em pareix una estafa. A banda, que el processador continua venent-se per 40€ menys del que em va costar (em costà 140 i ara val uns 100). És a dir, que o bé els fabricants ens estafen, o ací passa algo...

dilluns, 1 d’octubre de 2012

Odie Java

Doncs això, odie Java. Quins són els motius? Bàsicament el rendiment... Acabe de posar eclipse en el que considere un "pepino" d'ordinador:
AMD Phenom II 965 3,8 Ghz (Overclock)
4 GB de RAM
Windows 7 64 bits
ATI HD 5850X2 Crossfire (açò no val per a molt en quant a l'eclipse però bé, per vacil·lar).
I el cas que no he notat molta millora respecte al portàtil dels posts anteriors un Turionx2 1,6Ghz amb 2 GB de RAM  en windows XP.
Va a pedals, hi ha un lag d'entrada molt important. Pot ser que siga per un altre cas, però ni el entorns de desenvolupament comercials més importants en l'actualitat (Visual Studio i Delphi) van més què decentment, però l'eclipse, no hi ha manera.


De tota manera, algú podria dir, pots gastar una altre editor/entorn (a una mala es pot gastar el vi),  però el rendiment no és només en quant als entorns de desenvoupament, sino als programes, van realment lentos i consumeixen massa recursos per al que gasten. Com a anècdota, en android no va tant mal, igual per què la màquina virtual que gasten és més lleugera.

Però no anava a escriure tot un post només pel rendiment ;) El motiu principal que no m'agrada, és pel funcionament d'entrada eixida. Ja no hi ha cadenes de bytes per a representar cadenes de caràcters (char *), ni tant sols String, a la que et descuides tot són Read(Write) Buffer, Adapter, Stream...  Això fa que siga molt difícil provocar i controlar desbordaments de buffer (overflow), fent que siga molt més segur que els llenguatges convencionals. Però moltes vegades et faça pensar que estàs fent, almenys a una persona que ve de programar a baix nivell en ASM. Anem a il·lustrar-ho, en VB 6 per exemple es podia accedir als components d'una Grid per les coordenades:

object.TextMatrix(rowindex, colindex) [=string]
Grid.TextMatrix(0,0)="hola";

Per fer algo paregut en Java (en aquest cas, el SDK d'android):

String[] items = new String[] { "Hola")

};
ArrayAdapter<String> ad = new ArrayAdapter<String>(
                getApplicationContext(), android.R.layout.simple_list_item_1,

                items);


 gridview.setAdapter(ad);


No sé com ho veureu, però jo ho veig d'un engorrò...

dimecres, 19 de setembre de 2012

De moment, el tamany si importa, o almenys la potència

He tingut que canviar d'equip per a la programació de la base de dades. He gastat mysql. No és què el gestor de bases de dades siga molt exigent. El problema que he tingut és amb el client que han elaborat Mysql Workbench. Em fa gossera buscar un altre i este és el·laborat pels mateixos que fan Mysql. He canviat al fix i problema resolt ;)
Doncs be, el client al meu portàtil reciclat es queda penjat continuament (més que l'eclipse, què ja és dir), trobe que per a fer desenvolupament una mica seriosos no podré gastar-lo i hauré de canviar de màquina. Ja veurem que em duu el destí.
De moment he dissenyat la super base de dades (mode ironia on) que gastaran les aplicacions mòvils. Consistirà en una taula única de personatges d'un joc de rol molt simple:


En pròximes entrades aniré utilitzant esta taula, la idea és que el servidor la retorne a  una aplicació client als diferents dispositius mòvils.

Una vegada completada la base de dades (mode ironia on), anem a programar el servidor node.js, per defecte no té els drivers de mysql instal·lats, per tant haurem d'instal·lar-los:

 npm install mysql


Després programem el servidor, com ja haureu fet alguna vegada alguna cosa similar, no caldrà què m'explaie massa, és a dir:
1. Configurem la connexió
2. Executem la consulta
3. Mostrem resultats/errors

Ací tenim un exemple.

var Client = require('mysql').Client,
    client = new Client();
    client.user = 'root';
    client.password = 'root';
    client.host='127.0.0.1';
    client.port='3306';
    client.database='proves'
   
    client.query(
        'SELECT * FROM personatges',
        function selectPlayers(err, results, fields) {
            if (err) {
                console.log("Error: " + err.message);
                throw err;
            }
   
            console.log("Total de resultats: "+results.length);
            console.log(results);
            client.end();
        });


I esta seria la informació mostrada:






Molt bé! Funciona la consola, però el que volem no és això, si no enviar-li al client que s'ha connectat (navegador, app mòvil...) la informació, preferentment en un format manipulable, per exemple xml. Haurem de jungar el programa anterior, este i fer unes modificacions ;):
 var http = require("http");


var Client = require('mysql').Client,
        client = new Client();
        client.user = 'root';
        client.password = 'root';
        client.host='127.0.0.1';
        client.port='3306';
        client.database='proves';


http.createServer(function (request, response) {
  //Capturem el final de la petició, i creem una funció que escriurà el missatge
   request.on("end", function () {
      // El codi 200 vol dir què la petició ha segut correcta, i enviem la resposta en text pla.
      response.writeHead(200, {
         'Content-Type': 'text/plain'
      });
      // Enviem la resposta
    var res;
    client.query(
            'SELECT * FROM personatges',
            function selectPlayers(err, results, fields) {
                if (err) {
                    console.log("Error: " + err.message);
                        throw err;
                }
       
                console.log("Total de resultats: "+results.length);
                console.log(results);
            response.end("Total de resultats: "+results.length);
          
                client.end();
            });//final query
      //response.end(res);
   });
// Escoltem el port 1000
}).listen(1000);













Ara només ens faltarà manipular el resultat i tornar-lo en el format dessitjat:

var http = require("http");


var Client = require('mysql').Client,
        client = new Client();
        client.user = 'root';
        client.password = 'root';
        client.host='127.0.0.1';
        client.port='3306';
        client.database='proves';

//Creem el servidor, i quan "s'acabe" la petició, enviem al client la resposta, el missatge "<xml> <resposta>OK</resposta></xml>"
http.createServer(function (request, response) {
  //Capturem el final de la petició, i creem una funció que escriurà el missatge
   request.on("end", function () {
      // El codi 200 vol dir què la petició ha segut correcta, i enviem la resposta en text pla.
      response.writeHead(200, {
         'Content-Type': 'text/plain'
      });
      // Enviem la resposta
    var res;
    client.query(
            'SELECT * FROM personatges',
            function selectPlayers(err, results, fields) {
                if (err) {
                    console.log("Error: " + err.message);
                        throw err;
                }
            res="<xml><resposta><personatges>"
                console.log("Total de resultats: "+results.length);
                for(i=0;i<results.length;i++){
               res+="<personatge>";
      

               res+="<id>"+results[i].id+"</id>";
               res+="<nom>"+results[i].nom+"</nom>";
               res+="<classe>"+results[i].classe+"</classe>";
               res+="<nivell>"+results[i].nivell+"</nivell>";

               res+="</personatge>";
            }
            res+="</personatges></resposta></xml>";
            response.end(res);
                client.end();
            });//final query
      //response.end(res);
   });
// Escoltem el port 1000
}).listen(1000);

Segur que hi ha una classe per tornar el vector de respostes en .xml, però per a esta aplicació em costava més l'espart que l'escurada, vegem el resultat al navegador:


Podem observar que potser caldria donar-li un poc d'estètica a l'xml, posar retorns de carro, capçaleres xml correctes... però de moment, per a les proves que estic fent sobra ;)



dissabte, 15 de setembre de 2012

Creació d'un servidor simple amb node.js

Continuem amb el vell portàtil (haurem de canviar més avant), però per a l'aplicació servidor, de moment sobra. Amb la llibreta (aka notepad) de windows, y la consola de msdos anirem apanyat.
Primer de tot necessitarem un servidor, he triat node.js per què, com ja ho vaig dir en un altre post, m'ho va recomanar el meu amic Jaume. La ventatja? Fàcil instal·lació, configuració, programació (Javascript)... Per a instal·lar anem ací i ens baixem la versió corresponent al nostre sistema, instal·lem, i ja està, no hem de fer res més ;)
Ara crearem el nostre programa en javascript (els comentaris, són autoexplicatius ;)):

//Necessari per a connexions http
var http = require("http");


//Creem el servidor, i quan "s'acabe" la petició, enviem al client la resposta, el missatge "<xml> <resposta>OK</resposta></xml>"
http.createServer(function (request, response) {
  //Capturem el final de la petició, i creem una funció que escriurà el missatge
   request.on("end", function () {
      // El codi 200 vol dir què la petició ha segut correcta, i enviem la resposta en text pla.
      response.writeHead(200, {
         'Content-Type': 'text/plain'
      });
      // Enviem la resposta
      response.end('<xml><resposta>OK</resposta></xml>');
   });
// Escoltem el port 1000
}).listen(1000);


el guardem, per exemple amb el nom prova.js, i l'arranquem des del terminal:
Ara ens faltarà provar-ho, podriem crear un programa que enviara peticions http al port 1000, però, de moment ens apanyem amb el navegador, i enviem una petició http://localhost:1000:
I ja tenim el primer servidor en marxa ;) Continuarem accedint a un servidor mySQL, o alguna cosa similar ;)





divendres, 14 de setembre de 2012

Reciclant un vell portàtil (i 3)

O també podria titular-se, la primera aplicació en Android.
Crec que vaig a deixar d'intentar reciclar este ordinador, no pot amb l'eclipse, he intentat fer esta aplicació i m'ha costat déu i ajuda. Provaré a fer coses que necessiten entorn gràfic en un altre ordinador. Quan comence la part de servidor, si que podré gastar-lo de nou, ja que node.js (Recomanat pel meu amic Jaume) és molt lleuger, i amb la llibreta que duu windows es podrà fer els programes de sobra ;).
Bo, la primera aplicació l'he modificada un poc de l'anterior (l'aspecte), i l'he deixat com en la figura.
Simplement he posat un botó, i dos textView. No vaig a entrar en detalls de com es fa, de posar noms adients ni res per l'estil, ja que és una aplicació menuda i de prova.
l'objectiu serà que en el textView2 (que no es veu, està davall del textView1) aparega un missatge "has apretat el botó" en el moment que apretes el botó. Anirem al fitxer principal en java, en el meu cas ActivitatPrincipal.java i afegirem el codi dins de la classe, abans de l'última clau:



public void sendMessage(View view) {

        TextView TV = (TextView) findViewById(R.id.textView2);
        TV.setText("Has apretat")
    }
Això de moment és un procediment que no fa res, quan es crida al procediment, s'obté el component textView2 i en la segon línia es posa el text "Has apretat". Faltarà modificar l'xml de la interfície, en el meu cas, activity_activitat_principal.xml i modificar l'apartat del botó  per a indicar que a l'event OnClick es criure a l'anterior funció, afegirem
 android:onClick="sendMessage"

La meua etiqueta del botó ha quedat així:
<Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_marginRight="24dp"
        android:layout_marginTop="50dp"
        android:onClick="sendMessage"
        android:text="Apreta" />



Executem i vegem el resultat:


Pròxims passos:
1. Aplicació client -servidor
2. Aplicació client anterior en Windows Phone
3. Aplicació client anterior en Symbian
4, Aplicació client anterior en IOS, mmmm era broma ;)


dijous, 13 de setembre de 2012

Reciclant un vell portàtil (II)



Una vegada instal·lat els jdk i l'eclipse, anem a instal·lar els plugins per a l'eclipse de l'android. Però em fa gossera i com el tutorial funciona perfectament sense fer res, podeu seguir les instruccions ací. Depenet de la connexió pot tardar una hora entre actualitzacions i demés.


Ho deixarem tot per defecte. Vegem que podem canviar les versions d'android. Com estic fent proves, no vaig a tocar res, ja sabeu, si funciona, no ho toques.





 Un pas important és el final, que podem veure en la imatge següent, que indicarà el tipus d'activitat què farem, podem dir-li queè siga en forma de pestanyes, sense res... podem veure la previsualització per saber el tipus d'aplicació que realitzarem














Ja tindrem una finestreta on posar els nostres components. Si heu programat amb algun RAD, això vos sonarà molt. No té cap misteri.









El problema què tindrem ara, abans d'executar cap aplicació, és què hem de crear un dispositiu virtual (o connectar el nostre). És molt fàcil... A estes altures sobren comentaris, simplement buscarem elbotó de gestió de dispositius.


Cal dir, que des què he arrancat l'emulador fins que ha eixit l'hola, hauràn passat 10 minuts de rellotge. Però d'això parlarem demà, que hui estic cansat, Gustavo m'ha pegat molta canya.



De moment deixem l'aplicació per defecte i seleccionem què arranque en l'emulador que hem creat:


Recliclant un vell portàtil

M'he decidit a reciclar un vell portàtil i a reprendre una acció que tenia abandonada. Desenvolupament per android. El portàtil en qüestió és un Dell Inspiron 1501 que em vaig comprar allà al juny 2007, en acabar el meu primer curs com a professor. Un Turionx2 64 bits, el vaig ampliar a 2GB de RAM i vaig canviar el vista per l'XP. No sé com resultarà l'experiència, però anem a provar a fer "l'hola món!". Els passos seràn, primer baixar l'eclipse, és recomana la versió clàssica. 183MB després i hauré de continuar en un altre moment, què és hora de cuidar de la menuda i açò tarda molt en baixar ;)

Presentació

Després d'haver acabat els meus estudis d'Enginyeria Informàtica treballant de becari per a la UPV, vaig continuar treballant per a l'empresa S2grupo, fins que vaig decidir ser professor, allà al 2006. De vegades em plantetge retornar als vells temps, tot i que no ho he deixat, i he continuat col·laborant, això sí, esporàdicament en alguns projectes. Bé, ja veurem com queda la cosa, ací aniré abocant tots els miniprojectes, idees... que vagen passant pel meu cap.