luni, 29 iunie 2009

Hamachi + games, fixing a common issue

Ok vrem sa ne jucam impreuna un joc (sa zicem Age of Mythology, ca cu el m-am chinuit zilele astea), da? Vrem sa jucam prin LAN la distanta, deci vom folosi Hamachi. Problema e cand nu merge (aka pot sa dau ping din Hamachi, dar nu este vazut jocul creat, si nu ma pot conecta dupa IP, nici cel real nici cel de Hamachi), de ce nu merge? Inainte sa dai cu tastatura in monitor, read this :)

Well, problema este ca unele jocuri folosesc prin default IP-ul normal, si nu cel de Hamachi, si se conecteaza (si trimite date) deci la reteaua noastra, nu la cea virtuala facuta cu Hamachi. (Daca va pasioneaza, puteti citi mai multe aici.)

Si marea intrebare: cum il facem sa mearga? I'm the Linux chick, not the Windows geek, so eu am dezactivat pur si simplu placa de retea cu hamachi pornit, am deschis jocul, si dupa am reactivat placa de retea. Pentru o solutie mai eleganta, am gasit articolul asta. El zice ca toti cei care joaca trebuie sa faca asa:


Windows XP
1- Click Start and go to Control Panel
2- Go to Network Connections
3- In the menu at the top, click Advanced and then Advanced Settings.
4- You’ll see your Wireless or Local Area Connection in the list and Hamachi under “Connections.”
5- Click Hamachi and click the Green Up Arrow to move it to the top.
6- Click OK to close the dialog.

Windows Vista
1- Click Start and go to Control Panel
2- Click Network and Sharing Center
3- On the left side, click Manage Network Connections
4- Press the ‘Alt’ key and click Advanced then Advanced Settings at the top.
4- You’ll see your Wireless or Local Area Connection in the list and Hamachi under “Connections.”
5- Click Hamachi and click the Green Up Arrow to move it to the top.
6- Click OK to close the dialog.


Mai urmeaza si un alt blabla, dar nu este necesar sa faceti si bucata aia (experimental, AOM cel putin pare sa ignore parametrii din linia de comanda, si unei amice cu care jucam i-a mers si fara).

So have fun, si nu uitati sa va intrebati cu calm "de ce?" inainte sa dati pumni saracului calculator care face numai ce ii ziceti (si nu uitati ca e o diferenta mare intre ce ii ziceti sa faca si ce vreti sa faca ;) )

miercuri, 24 iunie 2009

FUCK YAHOO!!!

Cam radical titlul, but still, m-am saturat. De 2 zile trebuie sa vanez servere de yahoo care inca nu au trecut la noul protocol, neputandu-ma conecta de pe linux decat cu prostia de webmessenger.

Yahoo e evident just another money hungry company, de ce dreq toata lumea sta pe el? Care este scopul in a avea un protocol asa de special, cand s-a demonstrat in repetate randuri ca este mult mai vulnerabil decat protocoalele standard? Poate sa imi dea cineva alt motiv pentru asta si pentru faptul ca il schimba atat de des in afara de dorinta ca toata lumea sa foloseasca clientul oficial, sa poata sa afiseze reclamele alea idioate pe care oricum 99% din noi le ignora, si doar consuma resurse inutil? (yep, comments are welcomed, poate inteleg si eu).

Si, daca sunteti macar cat de cat de acord, intreb: de ce continuam sa folosim yahoo cand exista atatea alte servicii mai bune? Unele si mai sigure, si care consuma mai putine resurse...

Eu una propun google talk. Sincer acum, e protocol standard, it works! File transfer? WORKS! Si nu sunt probleme nici daca folositi alt sistem de operare in afara de windows. Voice chat? Calitate mult mai buna decat cu Yahoo. DE CE DREQ NU FOLOSIM GOOGLE TALK???!

Incep de acum treptat procesul de a renunta la toate serviciile oferite de yahoo. Partea trista este ca majoritatea lumii foloseste yahoo, deci va mai dura ceva pana sa pot sa fac schimbarea in totalitate, but it will happen!

Now free your mind and join me! Use open protocols!

vineri, 19 iunie 2009

yahoo au schimbat din nou protocolul de login

In caz ca va intrebati de ce uneori cand dati sa va conectati cu pidgin sau orice alt client de ymess (in afara de cel oficial), da eroare sau sta la connect, e din cauza schimbarii protocolului de login...

Partea misto e ca doar o parte din servere sunt updatate... Si adresa standard din majoritatea messurilor se conecteaza random la unul din acele servere... Poate aveti bulan si merge connectul, poate nu.

Oricum, o solutie temporara pana apare pidgin 2.6.0 (care suporta si noul protocol) este sa schimbati ip-ul serverului de yahoo in cs101.msg.mud.yahoo.com , care mie se pare ca imi merge.

E chiar annoying cum tot vor sa forteze utilizatorii sa foloseasca clientul lor oficial, care mananca mult prea multe resurse, doar cu scopul de a arata niste reclame idioate. Deh, money-hungry greedy bastards...

Si continui sa ma intreb... de ce este yahoo messenger asa de la moda in Romania? In alte tari, multi abia daca au auzit de yahoo. Sunt atatea alternative... gen Google Talk... protocolul jabber, open-source, merge cu n-spe mii de programe... De ce nu le folosim pe alea?


EDIT: Incepand cu Marti, 23 Iunie, nu mai merge nici ala. Try 66.163.181.189 , still works for me... si Pidgin, hurry up with teh release!

marți, 16 iunie 2009

Experiment cu google adsense

E interesant cum un blog proaspat inceput poate avea atatia vizitatori... aka daca nu scriu absolut nimic, google aduce cel putin 3-4 oameni pe zi... iar daca afisez ceva, eventual postez si linkul la status pe mess, am pana la 50 de vizitatori pe zi.

Ce ar fi daca as pune si niste reclame? Sunt puse intr-un spatiu care este oricum gol, deci nu va impiedica in nici un fel functionalitatea blogului, de asemenea e doar text, nu va distrage atentia de la lectura ... nu deranjeaza pe nimeni, si in plus ati putea gasi one day vreun link util pe-acolo...

So... oare cat se poate castiga din reclame in conditiile astea? Nu urmaresc neaparat profitul obtinut, ci mai exact sa imi satisfac o curiozitate. Daca sunteti curiosi, voi posta si rezultatele acestui mic experiment.

In alta ordine de idei, nu am mai avut timp sa postez toti algoritmii inainte de examen... desi am vazut ca au fost cititi si destul de cautati pe google... in special inainte de examen. Vor mai urma, dar probabil dupa sesiune... Acum am un alt examen urat... electronica...

sâmbătă, 13 iunie 2009

Greedy

Consideram urmatorul scenariu: esti cu prietenii si ati pus bani sa luati de baut. Va ajunge de o sticla de whiskey. Evident, o luati pe aia, desi probabil v-ati simti mai bine pentru mai mult timp cu o lada de bere si ceva chipsuri :P

Cam asta e treaba si cu algoritmul Greedy. El ofera solutia care, la pasul curent, pare cea mai buna, fara a se gandi la viitor (pasii urmatori). Pentru anumite categorii de probleme, ne ofera solutia optima intr-un timp foarte bun, pentru altele insa ne ofera o solutie mai putin optima.

Exemplul tipic este problema rucsacului. Avem un rucsac in care putem duce cel mult o masa mmax. Avem o serie de obiecte avand o masa masa[i] si o valoare val[i]. Pentru a lua doar obiectele cele mai importante, facem un raport valoare/masa, il sortam si luam pe rand obiectele cu raportul maxim.

Sunt doua tipuri de probleme: cea continua si cea discreta. La cea continua, putem lua si fragmente. Adica daca un obiect are masa 5kg, putem lua doar 2kg din obiectul respectiv. Asta merge cu greedy. Daca avem problema discreta, aka putem lua doar obiecte intregi, asta NU merge.

Sa vedem deci care e ideea de algoritm:
  1. sortam obiectele dupa raportul val/masa - O (n log n)
  2. parcurgem vectorul si cat timp nu s-a ajuns la o masa >mmax, mai adaugam un obiect (sau o parte dintr-un obiect) - O (n).
Complexitate: O(n log n).

Aveti aici o implementare mai simpla de greedy, care calculeaza la fiecare pas minimul dintre valorile ramase (complexitate O(n^2)) pentru a va face o idee generala cam cum merge.

vineri, 12 iunie 2009

Divide et impera

Incep cu un algoritm destul de simplu, care se face in liceu. Celebrul Divide et Impera... dezbina si cucereste. Think of it this way... esti la un party cu mult alcool. Daca combini toate bauturile si le dai pe gat, va fi foarte greu sa ramai treaz dupa, dar daca le imparti in paharele mici si le bei incet pe rand, atunci e mult mai usor si mai placut :)

Asa e si cu divide et impera... avem o problema grea, pe care o impartim in mai multe probleme mai mici, pana ajungem la o problema elementara care nu ne creeaza dificultati. Impartirea se face recursiv.

Sa luam ca exemplu MergeSort... un algoritm foarte dragalas de sortare a numerelor dintr-un vector... Care e ideea de baza? Pai tot impartim vectorul in jumate pana cand ajungem la 1 element.. care e sortat... dupa unim 2 jumatati de cate 1 element si le sortam, dupa unim 2 jumatati de 2 elemente etc.

Aici avem o implementare in C a algoritmului. Algoritmul standard este enuntat in carti ca incepand de la 1, noi il vom incepe aici de la 0.

Programul il puteti downloada si de aici.
#include <stdio.h>

#define MAXINT 32767;



void MERGE(int vector[],int start,int mijloc,int sfarsit)

{
int lungime1=mijloc-start;
int lungime2=sfarsit-mijloc;

int inceput_vector[lungime1+1];
int sfarsit_vector[lungime2+1];

int i,j,k;
for (i=0;i<lungime1;i++){

inceput_vector[i]=vector[start+i];
}

for (j=0;j<lungime2;j++){

sfarsit_vector[j]=vector[mijloc+j];
}

inceput_vector[lungime1]=MAXINT;
sfarsit_vector[lungime2]=MAXINT;

i=0;
j=0;
for (k=start;k<sfarsit;k++){

if(inceput_vector[i]<sfarsit_vector[j]){
vector[k]=inceput_vector[i];

i++;
}else{
vector[k]=sfarsit_vector[j];

j++;
}
}
}


void MERGEsort(int vector[],int start,int sfarsit)

{
int mijloc;
if (start<sfarsit-1) {

mijloc=(start+sfarsit)/2;
MERGEsort(vector,start,mijloc);

MERGEsort(vector,mijloc,sfarsit);
MERGE(vector,start,mijloc,sfarsit);

}
}

int main()
{
int vector[5]={2,5,1,4,3};

MERGEsort(vector,0,5);
int i;

for (i=0;i<5;i++)
printf("%i ",vector[i]);

return 0;
}



Programul asta va rula in mare parte conform imaginii urmatoare:


Deci, ideea de baza: impartim vectorul in bucati mai mici, iar apoi unim bucatile respective in ordine...

Urmeaza intrebarea: cat este complexitatea algoritmului? Pai O(n log n), mult mai bine decat bubblesort si sortarea cu 2 foruri, care au O(n^2).


Un alt algoritm foarte folosit este Binary Search-ul. Este un algoritm care cauta un element intr-un vector sortat, avand o complexitate O(log n). Cum ajunge la complexitatea asta? Pai face asa. Vede daca elementul este la mijloc. Daca nu e, atunci... daca e mai mic decat mijlocul, cauta in jumatatea inferioara, iar daca e mai mare, in jumatarea superioara.

Programul este cam asa (fisier txt) :
#include <stdio.h>

int BinarySearch(int vector[],int start,int sfarsit,int element)

{
if (start==sfarsit) return -1;//sau -start pentru a obtine pozitia pe care ar trebui sa se afle;

int mijloc = (start+sfarsit)/2;
if (vector[mijloc]==element) return mijloc;

if (vector[mijloc]<element) return BinarySearch(vector,start,mijloc,element);

if (vector[mijloc]>element) return BinarySearch(vector,mijloc+1,sfarsit,element);

}

int main()
{
int vector[5]={1,2,3,4,6};

printf("%i\n",BinarySearch(vector,0,5,3));

printf("%i\n",BinarySearch(vector,0,5,5));

return 0;
}
Evident, sunt mult mai multe aplicatii ale acestui algoritm, dar cam asta e conceptul de baza. Si tineti minte... Daca aveti mai multi amici care se cearta, intai ii separati, dupa discutati cu fiecare in parte, dupa ii readuceti la un loc si ii puneti sa discute intre ei. ;)

Back again...

A trecut o luna de cand nu am mai scris nimic... missed me? :P

Tocmai a trecut cel mai urat semestru din facultatea de calculatoare... s-au dus temele, mai e doar sesiunea...

Deja ma repet daca continui sa ma plang de numarul mult prea mare de teme pe care il avem, asa ca voi continua prin a anunta ca blogul va fi updatat mai des la vara, iar pentru acum, ca tot trebuie sa recapitulez algoritmi elementari la PA, si articolul despre backtracking a avut un succes neasteptat (daca ma iau dupa keyword-urile cu care a ajuns lumea de pe google aici), voi face un rezumat al principalilor algoritmi, s-ar putea sa ajute pe cineva :)

Dupa another friendly reminder de NU DATI LA POLITEHNICA!!!, going back to work, voi reveni in curand.