Blogia
Geeks i d'altres

Programació

Method HEAD

El meu objetiu es que el server web sigi el més estandar posible. Una de les pases per aconseguir, és que pugi acceptar més methods que simplement GET's.
Per a ser "validat" com a HTTP 1.1 basta acceptar GETs i HEADs, i l'unic que diferència el HEAD del GET es que amb el HTTP Response no s'inclouen les dades que es demanen al HTTP Request. Com ja sabeu, un response es forma a partir dels headers i les dades; ido en el cas d'una petició HEAD domés es retornen els headers, les dades NO.

Aixó es molt facil d'implementar. Per a saber si ens trobam davant un method GET o HEAD, empram aquest codi (una vegada que ja hem lletgit el HTTP Request del socket).

if(request[0] == 'G' && request[1] == 'E' && request[2] == 'T') {
     method = GET;
     longi = 5;
}
else {
     method = HEAD;
     longi = 6;
}


Si algú té una suggerencia per a fer la comprovació anterior més "elegant", sóc tot orelles ;). Com podeu imaginar, abans hem definit el GET i el HEAD ..

#define GET 0
#define HEAD 1


Ara que ja sabem si tenim un GET o un HEAD, el que em de fer es afegir les dades en cas de que sigi un GET.

if(method == GET) {
     strcat(response,data);
}


Com veis, és una "pixarada de ca", com es diu per aqui. Encara no he penjat la nova versió perque aquests dies estic sense ordenador, perque la font d'alimentació es va cansar de treballar sense descans i va dir prou, i com que no he pogut probar-ho com toca no vull penjar un codi que façi coses extranyes (encara que no seria la primera vegada .. :D).

El pròxim objectiu: que presenti imatges, i no tan sols texte plà i pagines html.
Fins una altra!

Més server web ..

Els darrers dies he afegit un bon grapat de millores al server. Primer de tot, la concurrència, que és un tema molt important. Pel meu compte vaig programar un server que es posava a escoltar al port 80, acceptava un HTTP Request i responia amb un HTTP Response, i s'acabava. Després vaig fer un bucle infinit, per que pogues acceptar infinites peticions.

Jo estava tot content, perque tenia un server que pensava que podria funcionar bé. Pero fa uns dies vaig xerrar amb un company que em va demanar si emprava concurrència. Com que jo no tenia ni idea de a que es referia, li vaig demanar que volia dir, i ell em va explicar molt bé el tema amb una analogia. En aquells moments, el meu server era com una cua de supermercat. Entrava una petició i es tornava la resposta, pero mentres no es podia acceptar cap altre petició, així que els altres clients havien d'esperar a que el que havia entrar primer fos contestat. A els que estodiau informàtica a la UIB en Ricardo Galli vos ho deu explicar molt millor a l'assignatura de sistemes operatius, ja que el meu server en aquell moment es pareixia molt a un sheduler implementant l'algoritme FIFO (first in first out, el primer que arriba es el que primer s'atèn, i no se n'atèn un altre fins que aquest no ha finalitzat).

Així que havia d'emprar concurrència per a fer el meu server més eficient. La idea es molt senzilla; poder atendre a més d'un client a l'hora. Pero un sol programa no pot fer dues coses a l'hora, així que aqui entren en joc els procesos fills. Als sistemes *nix, els procesos segueixen una jerarquia estricta, i un programa pot crear un procès fill amb la cridada fork() i asignar-li una tasca. Podeu trobar molta més informació a la ManPage de fork (si no trobau el fork al man, el més provable és que hagueu de baixar el paquet de Debian manpages-dev).
Vaig lletgir una mica sobre el tema, ja que el tenia molt verd (només ho recordava d'un llibre de sistemes operatius de Tannembaum que vaig començar a lletgir fa estona, pero vaig deixar a mitjes ..), pero va ser molt facil.

El que s'ha de fer és que el procès pare, el server, escolti al port 80. Quan arribi una petició per a servir una pàgina, s'ha de crear un procès fill que la serveixi, i tornar-se a posar a escoltar.

L'únic problema és que una vegada que el procès fill ha servit la pàgina, es queda en estat "zombie". L'única intenció d'aquest estat és que el procès pare pugi saber perque el seu fill ha "mort", pero com que nosaltres sabem que el 99,9% de les vegades que els fills moren és per que han acabat la seva feina, no ens interesa tenir cadàvers per casa (o ocupant un espai a la Taula de Procesos ;)), així que hem d'emprar waitpid() per a matar al fill ben mort i que no ens molesti. Al man de waitpid trobareu molta més informació, i no estaria gens malament que lletgisiu una mica de teoria sobre procesos (aquesta regla també se m'aplica a jo, perque estic bastant verd en el tema de estats dels procesos i coses així ... ja és hora de tornar a treure el llibre de Tannembaum de la biblioteca de l'Anselm Turmeda xD).

Bé, el tema está així, ara tenc un server web que fa feina amb procesos fills per servir les pagines (com feia l'Apache1), pero l'implementació del protocol HTTP és una vergonya. El meu objectiu actual és fer una cosa mitjanament estandart, creant uns bons HTTP Responses i acceptant alguna cosa més que rebre GETs i servir pagines en text/http :D

Com sempre, el codi está disponible en la seva darrera versió a "http://servomac.funpic.org/code/serverCon.c", sota la llicència GPL.

S'esperen comentaris, crítiques (tant constructives com destructives, no m'aconseguireu minar la moral) i tot el que sigi relacionat amb el tema del server. Salut!

Server Web

Fa uns dies un company me va comentar que tenia com a projecte de programació d'aquest estiu programar un server web mitjanament decent, que servís pàgines webs amb html. Li vaig dir que me pareixia una bona idea, i que d'aqui unes setmanes m'hos hi podriem posar.
Me vaig anar informant, i vaig començar a lletgir es RFC 2616, i he fet un server de sockets TCP que escolta al port 80, lletgeix la pagina que demana el navegador (de l'HTTP Request) i envia un HTTP Response amb el codi de la pagina.

El codi font és a http://servomac.funpic.org/code/web_server.c, i està llicenciat sota GPL.
Ara per ara és una porqueria. Només accepta una petició HTTP, contesta i surt del bucle. El meu objectiu principal es que sigi capaç de servir pagines fins que el root acabi l'execució.

Per una altra banda, l'HTTP Response és molt pobre i s'hauria de millorar. A més, dona per suposat que la versió del protocol és la 1.1, i moltes altres coses que són 100% anti-robustesa. Com deia en Guillem als comentaris del tema anterior, he de donar gracies a que el navegador toleri tants d'errors :P.
Si teniu un moment, m'encantaria que mirasiu el codi i hem fesiu tots els comentaris posibles per a millorar el codi i el programa en general. S'agrairia molt, ja que això no és més que una versió alpha :D.

Salut!

ACTUALITZACIÓ : Acab d'afegir posibilitat de respondre a més d'una petició cada execució del programa, mitjançant un bucle infinit i procesos fills. He creat un CHANGELOG (que podeu trobar a "http://servomac.funpic.org/code/CHANGELOG.txt") on faig comptes anar publicant els canvis en el codi. La nova versió del server, amb concurrència, està publicada a "http://servomac.funpic.org/code/serverCon.c". Encara no tenc gens de maña amb el tema de jerarquia de procesos i tal, i no tenc ni idea de si estic fent una "xapusa". Ja em donareu la vostra opinió!

ACTUALITZACIÓ 2 : Ara ja mat els procesos zombies amb waitpid, perque no molestin a la taula de procesos.

Kate

Kate (KDE Advanced Text Editor) és l'editor d'archius de codi font, fitxers de configuració i d'altres al KDE. Entre les features que més em criden l'atenció trobam que duu una Konsole incorporada, i que pots veure el mateix document desde dues bandes a l'hora. El millor no és sols que es pugi veure; ademés es pot modificar i els canvis fets a una de les "vistes" modifiquen automàticament l'altre. Aixó pot ser d'extrema utilitat programant, per exemple. A l'hora que modifiques una funció, crees una mica de "codi andàmio" dins la funció main per a comprovar que la cosa funciona com tu vols. Tot un descans a l'hora de programar amb fitxers de codi més llargs de l'habitual.

Com no podia ser d'altre manera, inclou highligth per als llenguatjes de programació més habituals, a més d'archius de configuració, llenguatjes d'script interpretats, llenguatjes "d'etiquetes" (markup, com html i d'altres) ...
Pero el millor és que tu mateix pots crear nous archius de configuració xml per a fer highligthing a nous tipus de documents, o modificar els ja existents. Vos deix un enllaç que ho explica, per si a algú li crida l'atenció. Evidentment també pots modificar l'esquema de colors actual, canviant el color que s'assigna a cada tipus de variable, per exemple. Ho podeu veure a aquest screenshot.

En definitiva, si el Gedit ja m'agradava, el Kate té el meu cor a la seva mà.

Formuletes en php

Aprofitant que a Física acabam de fer un tema més que senzillet, el de Cinemàtica, he fet un petit script de php que conviu amb uns formularis d'html i hem serveix per fer els calculs básics amb el moviment rectilini uniformement accelerat.

Pareix que funciona bé, i encara no he obtengut cap error. Si algu troba algun bug, s'agrairia que el reportàs. El que deiem, la pagineta en qüestió és aqui : Caiguda lliure.

Formuletes en php

Aprofitant que a Física acabam de fer un tema més que senzillet, el de Cinemàtica, he fet un petit script de php que conviu amb uns formularis d'html i hem serveix per fer els calculs básics amb el moviment rectilini uniformement accelerat.

Pareix que funciona bé, i encara no he obtengut cap error. Si algu troba algun bug, s'agrairia que el reportàs. El que deiem, la pagineta en qüestió és aqui : Caiguda lliure.

Un intent d'emulació de la comana cat

Fa una estona m'aburria, i tenia el nano i el gcc a mà, i aixó és el que n'ha sortit d'aquesta mescla explosiva;

#include

int main(int argc, char *argv[])
{
char caracter, buffer[256];
FILE *fichero;

if (argc != 2)
{
while(1) //Bucle infinito
{
fgets(buffer,256,stdin);
printf("%s",buffer);
}

return 1;
}

fichero=fopen(argv[1],"r");

while(caracter != EOF)
{
caracter = fgetc(fichero);
printf("%c",caracter);
}

fclose(fichero);
return 1;
}


Necesit crítiques constructives per part de programadors de bon de veres ... alguna funció mal emprada? Se li hauria de fer algun hack? Alguna falla important?
Ara que m'ho mir una mica, hauria de posar cualque comentari (encara que sigin tan poques linies :P), que després agafaré mal vicis.

Llevantli el rovell als Sockets

Feia mooooolt de temps que no emprava sockets, i com que tenc pensat fer un chat grafic per a linux amb C, emprant sockets i Qt estic començant pel básic. He programat dues aplicacions, un client i un servidor, que es transmeten una cadena per la xarxa. Si, així de senzill, pero no voldreu que començi la casa pel terrat i hem posi a programar el chat sense tenir una base!
He publicat el codi al meu rebost (http://usuarios.lycos.es/macservo/), el client aqui i el servidor aqui, per si li voleu pegar una ullada. Salut!

Simulant batalles de Warhammer

Aquests darrers dies he estat codificant un programa que simula una batalla entre dos regiments emprant les regles del joc de rol Warhammer (crec que la definició "joc de rol" s'ajusta a les seves característiques, perque et fiques a la pell d'el comandant d'un exercit, encara que també hi intervengin factors com la preparació prèvia de l'exercit i l'atzar a l'hora de fer les tirades de daus).
Per escriurer-ho he empleat el llenguatje C, perque és el que tenc més per mà (ademés és de l'unic que puc dir que en conec les característiques i la sintaxis básiques). Es podria dir que estar acabat, pero encara he d'anar pulint algunes errades, intentaré millorar la presentació del codi i optimitzar-lo el máxim que pugi. Com que són un bon grapat de linees (250 aproximàdament), el penj a una altra página i vos en pas un enllaç. Si el voleu compilar desde GNU/Linux feis el seguent :

gcc nomdelarchiudecodi -o nomdelexecutable

Després d'aixó, per executarlo feis ./nomdelexecutable, o simplement el clicau desde l'entorn gràfic.
I per a fer-ho a Windows podeu emprar cualsevol compilador de C. Jo sempre emplei el Dev-C++, que podeu baixar d'aqui.

El codi font el podeu trobar a http://usuarios.lycos.es/macservo/warhammer.c.
Si algú el prova agrairé tots els comentaris posibles! Salut!

Proposicions (indecents)

Tenc dues proposicions (bastant geeks) per la setmana que vé. M'he decidit a reciclar els meus coneixement i tornar-me a mirar els Sockets (ja sabeu, la manera d'enviar informació entre máquines empleant algun protocol de xarxa) en C i programar un simple client/servidor, on al client introdueixis una cadena de caracters i l'imprimeixi al servidor, i aprendre a fer coses básiques de programació gràfica, també amb C, empleant kdevelop i el que façi falta (més que res per entrenar-me per fer-li un entorn gràfic bó al programa dels warhammers que m'he montat). Alomillor aquesta darrera proposició haurà de ser una mica més de llarg termini, perquè no tenc ni idea com de dificil és el tema de les Qt (les llibreries gràfiques de KDE). Encara que si arrib a dominar els aspectes básics d'ambdós caires del llenguatje C (mira tu quina frase més culta que m'ha sortit xDD) intentaré programar un chat-gràfic, a l'estil dels típics programes de IM (crec que és l'acrònim de Instant Mensagery, o alguna cosa semblant :P) que tots empram dia a dia. Tot això sota lliçència GPL, és clar ;).

I dic la setmana vinent perquè aquesta setmana tenc dos examens d'una importància considerable. Demà en tenc un de Filosofia, amb un tema que duu per títol Diversitat i Historicitat de les Cultures; realment aquest és molt senzill, però els que hem preocupen són els de Matemàtiques (ho pos en negreta perquè és una assignatura a la que tenc un respecte descomunal, i no domés per la seva dificultat, que crec que és intrinseca de la matèria (veis, avui estic inspirat amb el vocabulari culte .. és el que té estodiar dels apunts d'en Pep Bernat, el profesor de filosofia), si no també pel relativament malament que em va l'asignatura (el primer trimestre casi vaig suspendre, pero al darrer examen vaig treure un 9.5, nota de la que estic orgullosisim!!) i el necessaris que hem seràn els coneixements que ens explica en Duràn amb cara de mala llet a la pissarra, perquè si tot va bé d'aqui dos anyets estaré fent una carrera ón el primer any el 50% de les matèries són comunes amb la carrera de Matemàtiques ...). Després de aquests parèntesis m'imagin que vos haureu perdut, perquè fins i tot jo he hagut de mirar que estava escrivint abans de posar-me a filosofar sobre les matemàtiques, així que tornam a començar. L'examen de matemàtiques que tenc el dijous és de trigonometria, i hi entra una quantitat (amb gran dificultat) de materia considerable, al igual que el de Castellà, on entra tota la materia vista fins ara ...
Bé, aquesta és la vida de l'estodiant, i ja és hora de que m'en vagi donant compte (o s'escriu conta? realment, té poca relevància :P) de que toca posar colzes si vull treure cualque resultat positiu de tot això.

Salut bona gent!