Second Opinion
Folosind serviciul second opinion ne puteți trimite RMN-uri, CT -uri, angiografii, fișiere .pdf, documente medicale. Astfel vă vom putea da o opinie neurochirurgicală, fără ca aceasta să poată înlocui un consult de specialitate. Răspunsurile vor fi date prin e-mail în cel mai scurt timp posibil (de obicei în mai putin de 24 de ore, dar nu mai mult de 48 de ore). Second opinion – Neurohope este un serviciu gratuit. www.neurohope.ro |
[CONCURS] Hunt down the bug :-)
#1
Posted 09 September 2008 - 11:53
Pe langa "better code practices" si "worst code practices", in urma acestui thread mi-a venit in minte inca un exercitiu bun pentru incepatori: Gaseste bugurile!
Aceste thread-uri apar si in sectiunea "thread-uri utile despre probleme comune" din Sfaturi de programare în PHP Acum codul: 1 <?php 2 function get_fstree_recursive($target) { 3 $cwd = opendir($target); 4 $r = array(); 5 if($cwd) { 6 while($rel_path = readdir($cwd)) { 7 if('.' == $rel_path || '..' == $rel_path) { 8 continue; 9 } 10 if(is_dir($rel_path)) { 11 $r[$rel_path] = get_fstree_recursive($target.DIRECTORY_SEPARATOR.$rel_path); 12 } 13 elseif(is_file($rel_path)) { 14 $r[] = $rel_path; 15 } 16 } 17 } 18 return $r; 19 } 20 21 var_dump(get_fstree_recursive('.')); 22 23 ?> 24Hunt 'em down! Codul are un mic bug care e usor de reparat de indata ce intelegi ce se intampla, plus inca un bug in care e vorba mai mult de "nuanta" Rog avansatii sa le lase placerea incepatorilor Edited by OriginalCopy, 09 September 2008 - 11:54. |
#2
Posted 09 September 2008 - 14:05
ne dai un mic ajutor ? ma chinui de ceva timp si nu stiu cu certitudine la ce vrei sa ajungi dar banuiesc ca vrei sa apara ceva in genul asta
Quote <?php $a = array(1, 2, array("a", "b", "c")); var_dump($a); ?> array(3) { [0]=>int(1) [1]=>int(2) [2]=>array(3) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" } } LE: am vazut ce te-ai folosit de DIRECTORY_SEPARATOR ... care e avantajul pentru care ai ales varianta asta ? Edited by vali38, 09 September 2008 - 14:15. |
#3
Posted 09 September 2008 - 14:16
vali38, on Sep 9 2008, 14:05, said: ne dai un mic ajutor ? ma chinui de ceva timp si nu stiu cu certitudine la ce vrei sa ajungi dar banuiesc ca vrei sa apara ceva in genul asta Nu vreau sa ajung la ceva anume. Functia trebuie sa returneze intreg arborele de fisiere si directoare de sub directorul curent ('.') intr-un array. Insa e un bug mic (usor de gasit) si unul mare (greu de gasit). Testeaza cu diferite date de intrare si-ti vei da seama, apoi repara-le. Poate gasesti doar un bug si doar o solutie, ceea ce e bine oricum Mai important e sa documentezi bug-ul decat doar sa corectezi codul. Wikipedia: http://en.wikipedia....ki/Software_bug PS: Ca sa testezi rapid foloseste PHP din CLI: Quote msdos> C:\php\php.exe -f ../buggytree.php LE vali38, on Sep 9 2008, 14:05, said: LE: am vazut ce te-ai folosit de DIRECTORY_SEPARATOR ... care e avantajul pentru care ai ales varianta asta ? |
#4
Posted 09 September 2008 - 16:23
prima problema si cea mai evidenta fara de care nu puteai face nimic era legata de elseif...daca un if are cel putin un elseif,trebuie sa aiba obligatoriu un else
<?php function get_fstree_recursive($target) { $cwd = opendir($target); $r = array(); if($cwd) { while($rel_path = readdir($cwd)) { if('.' == $rel_path || '..' == $rel_path) { continue; } if(is_dir($rel_path)) { $r[$rel_path] = get_fstree_recursive($target.DIRECTORY_SEPARATOR.$rel_path); } else { $r[] = $rel_path; } } } return $r; } var_dump(get_fstree_recursive('.')); ?> acum imi prajesc neuronii la cea de-a doua problema...directoarele din directoarele directorului ) dat nu sunt afisate... |
#5
Posted 09 September 2008 - 17:04
vali38, on Sep 9 2008, 16:23, said: prima problema si cea mai evidenta fara de care nu puteai face nimic era legata de elseif...daca un if are cel putin un elseif,trebuie sa aiba obligatoriu un else Nu, nu trebuie. LE: este recomandat incepatorilor sa trateze fiecare caz posibil cu scopul de a le dezvolta simtul pentru "toate felurile posibile de input sau error handling/reporting", dar nu e obligatoriu (daca stii ce faci, si acum stii ce faci ) LE 2: la sfarsit vom discuta si despre asta. Pe scurt: pe lumea asta exista si alte lucruri pe un filesystem pe langa fisiere si directoare, care pe noi nu ne intereseaza; ne concentram pe algoritmica) vali38, on Sep 9 2008, 16:23, said: acum imi prajesc neuronii la cea de-a doua problema...directoarele din directoarele directorului ) dat nu sunt afisate... PS: vezi ca nu e vorba numai de directoare, ci si de fisiere, ie: "arborele de fisiere si directoare". Ce se intampla cu ele? Un mic detaliu, dar important LE 3: ok, rewind "LE 1", ca sa nu te derutez mai mult. Ceea ce stii e un sfat bun, mereu trebuie sa fie un "else" intr-o conditie. In practica, mereu va fi un else pentru cazurile neasteptate care pot aparea pe parcursul dezvoltarii aplicatiei. De exemplu, dezvolti aplicatia si ajungi sa pasezi un tip de argument unei alte functii pe care ai uitat sa o modifici in asa fel incat sa proceseze acel tip de input. In acest caz ramura else isi face treaba. Insa acum in PoC-ul de mai sus incercam sa izolam problema, algoritmica, de factori externi (cum ar fi un alt fs pe care nu-l tratam). Acum tratam exclusiv fisierele si directoarele si ne concentram pe algoritmica,nu pe prelucrarea de input cat mai larg, si nici nu incercam sa facem functia cat mai reutilizabila. Sper ca ai inteles... LE: defapt, felul in care ai modificat acum functia nu ruleaza asa cum ar trebui pe sistemul meu linux. Adica ruleaza, insa nu e scrisa pana la capat asa incat sa trateze si celelalte tipuri de fisiere, deci are si mai multe "pseudo-buguri". Edited by OriginalCopy, 09 September 2008 - 16:57. |
#6
Posted 10 September 2008 - 10:12
Quote LE: defapt, felul in care ai modificat acum functia nu ruleaza asa cum ar trebui pe sistemul meu linux. Adica ruleaza, insa nu e scrisa pana la capat asa incat sa trateze si celelalte tipuri de fisiere, deci are si mai multe "pseudo-buguri". sa inteleg ca pe linux nu iti afisaza toate tipurile de fisiere ? am si eu o distributie linux bazate pe rpm (opensuse) instalata dar am ramas la windows pentru ca nu pot folosi soft-urile adobe si lucrul cu fisierele intre win si linux e destul de greoi ------------------------------------ de cand ai postat topicul tot caut acele buguri si crede-ma ca imi fug ochii...nu mai stiu unde si la ce sa ma uit TEORETIC ar trebui sa mearga (una din replicile programatorilor ) aseara am iesit afara cu functia pe o foaie si am dat peste un prieten ca e la politehnica si se pricepe destul de bine la programare...i-am aratat codul si a zis ca sunt nebun (nu stie care e problema) pentru a mai descoperi cate ceva,ori nu gandesc indeajuns de profund ori nu stiu la ce sa ma uit...ai incercat mai sus sa izolezi cazul dar tot nu stiu unde sa-mi arunc ochii |
#7
Posted 10 September 2008 - 11:18
Pe linux tipurile de fisiere sunt: fifo, char, dir, block, link, file, socket. Functia lui OriginalCopy ia in calcul doar dir si file, restul le ignora (nu asta e important, ci greselile.Un bug e evident, celalalt e mai subtil si nu se manifesta decat in anumite conditii).
Offtopic 1: Din cate am vazut is_link() e true doar pentru soft links. Cum facem cu hard link-urile? Offtopic 2: Iti recomand o distributie bazata pe .deb, e mult mai simplu la Debian. Incearca (k|x)ubuntu. |
#8
Posted 10 September 2008 - 12:14
Sunt mai incepator in php asa ca o sa explic mai pe limbajul meu )
Problema cu directoarele si fisierele este ca dupa ce listeaza ce se in afla directorul radacina , cand verifica daca este un subdirector sau un fisier nu i se da pathu complet de ex . - folder fiser.txt $rel_path va contine doar "folder" sau "fisier.txt" calea corecta este .\folder sau .\folder/fisier.txt deci in cele 2 if-uri trebuie sa avem ($target."/".$rel_path) Edited by doriaal, 10 September 2008 - 12:40. |
#9
Posted 10 September 2008 - 12:28
doriaal, on Sep 10 2008, 12:14, said: Sunt mai incepator in php asa ca o sa explic mai pe limbajul meu ) Problema cu directoarele si fisierele este ca dupa ce listeaza ce se in afla directorul radacina , cand incearca sa intre intr-un subdirector nu va putea pentru ca i se da un path imcomplet de ex avem : . - folder fiser.txt $rel_path va contine doar "folder" sau "fisier.txt" calea corecta este .\folder sau .\folder/fisier.txt deci in cele 2 if-uri trebuie sa avem ($target."/".$rel_path) -- Off-topic: (joke), cand cineva iti face un compliment asta e o replica posibila, "continua", "da, dezvolta te rog" Edited by OriginalCopy, 10 September 2008 - 12:29. |
#11
Posted 10 September 2008 - 12:52
LE: dar da, acela este bugul evident. Incearca si sa-l corectezi. +1 doriaal :-)
|
#12
Posted 10 September 2008 - 12:52
Ok , de al doilea nu stiu ce sa zic , desi nu e bug poate e legat de modul de a scrie codul
-pentru readdir() e mai corect sau utilizezi operatorul === sau !== cand parcurgi directoarele - sau ceva legat de permisiuni |
#13
Posted 10 September 2008 - 12:57
vali38, on Sep 10 2008, 12:51, said: mai are careva puzzleuri ? Al doilea bug e inca in picioare ... :-) doriaal, on Sep 10 2008, 12:52, said: Ok , de al doilea nu stiu ce sa zic , desi nu e bug poate e legat de modul de a scrie codul -pentru readdir() e mai corect sau utilizezi operatorul === sau !== cand parcurgi directoarele - sau ceva legat de permisiuni Nu. Bineinteles sunt si acestea buguri, dar aici nu e vorba de modul tehnic de programare, ci de algoritmica. Se considera ca folosim un fs care cunoaste doar fisiere si directoare (cum e FAT), fara drepturi de acces sau alte lucruri. Oricum, cineva scrie si codul pt bug? Ar fi o surpriza, dar e posibil sa ai impresia ca e usor de reparat un bug de indata ce gasesti cauza si totusi sa nu-l repari complet :-) |
#14
Posted 10 September 2008 - 13:01
<?php function get_fstree_recursive($target) { $cwd = opendir($target); $r = array(); if($cwd) { while(false !== ($rel_path = readdir($cwd))) { if('.' == $rel_path || '..' == $rel_path) { continue; } if(is_dir($target.DIRECTORY_SEPARATOR.$rel_path)) { $r[$rel_path] = get_fstree_recursive($target.DIRECTORY_SEPARATOR.$rel_path); } elseif(is_file($target.DIRECTORY_SEPARATOR.$rel_path)) { $r[] = $rel_path; } } } closedir($cwd); return $r; } var_dump(get_fstree_recursive('.')); ?> mai bine DIRECTORY_SEPARATOR nu doar "/" cum am zis la inceput . ( Unix / Windows separators ) Edited by doriaal, 10 September 2008 - 13:05. |
#15
Posted 10 September 2008 - 13:15
Pt al doilea bug indiciul lui florindinu:
florindinu, on Sep 10 2008, 11:18, said: Un bug e evident, celalalt e mai subtil si nu se manifesta decat in anumite conditii). Offtopic 1: Din cate am vazut is_link() e true doar pentru soft links. Cum facem cu hard link-urile? Offtopic 2: Iti recomand o distributie bazata pe .deb, e mult mai simplu la Debian. Incearca (k|x)ubuntu. Quote [flav@evolution test]$ ls -li total 0 2179098 -rw-r--r-- 2 flav users 0 2008-09-10 13:09 test 2179098 -rw-r--r-- 2 flav users 0 2008-09-10 13:09 test.hard 2179099 lrwxrwxrwx 1 flav users 4 2008-09-10 13:09 test.soft -> test Congrats doriaal you've hunted down one bug |
|
#16
Posted 10 September 2008 - 13:34
OriginalCopy, on Sep 10 2008, 14:15, said: Pt al doilea bug indiciul lui florindinu: 1. inode #: [flav@evolution test]$ ls -li total 0 2179098 -rw-r--r-- 2 flav users 0 2008-09-10 13:09 test 2179098 -rw-r--r-- 2 flav users 0 2008-09-10 13:09 test.hard 2179099 lrwxrwxrwx 1 flav users 4 2008-09-10 13:09 test.soft -> test Dap.. in consola e ok, dar in php e buba, poti avea.. [vroiam sa scriu ceva dar poate asta e al doilea bug] OriginalCopy, on Sep 10 2008, 14:15, said: 2. oh no, not another distro-war - stim cu totii ca nu iese nimic constructiv :-) Eu personal folosesc ArchLinux, INSA cel mai bine e sa incerci cele mai folosite distributii (google: distrowatch) si sa decizi pentru tine ce ti-e bun. Nope, fara distro/os wars, sunt ok toate, e doar o parere personala si un sfat pe care l-am primit si eu de la altii la inceput Edited by florindinu, 10 September 2008 - 13:34. |
#17
Posted 10 September 2008 - 13:36
#18
Posted 10 September 2008 - 13:47
OriginalCopy, on Sep 10 2008, 14:36, said: Nu e asta, nu are legatura cu fs-ul. Hint: fluxul de date Ma gandeam, dar "better safe..". Eu am rearanjat putin codul si am facut 3 modificari, 2 le-am vazut si la doriaal. Astept si eu raspunsul final, sunt curios daca le-am nimerit. Mai sus vroiam sa zic chestia asta: Problema cu functiile de genul asta si hard link-uri e ca poti avea link-uri recursive.. si atunci e nasol daca nu ai grija. Cred ca is_link() ar trebuii sa intoarca true si pentru hard link-uri (la mine nu face asta pentru un link cereat cu: ln test.txt link). |
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users