Ostatnie wiadomości
Generowanie mapy witryny - prosta, wydawało by się - rzecz. Jednak, kiedy w naszej firmie pojawiło się wolne stanowisko programisty postanowiliśmy właśnie takie zadanie dać kandydatom do zrealizowania, w celu odsiania "programistów" od programistów.
Zadanie okazało się jednak wykraczające poza wszelkie normy i na jakieś 20 osób (na przestrzeni 5 miesięcy) udało się je zrobić 5. Z tego dwie skopiowały (nie do końca działające) rozwiązania z sieci...
Twoje zadanie - mając tabelę (CREATE TABLE `_tree` (`id` INT(11), `parent` INT(11), `sort` INT(11), `nazwa` VARCHAR(255))) napisz skrypt, który wygeneruje mapę witryny w HTML (w dowolnym standardzie). Większość osób zaczyna od napisania prostego zapytania wyciągającego wszystkie wpisy z parent = 0. Nieliczni dodadzą jeszcze sort. Później, jeżeli ktoś już to zrobi przystępuje do zagnieżdżania kolejnych poziomów while() a nam ręce opadają ...
Dlatego, drogi poszukiwaczu odpowiedzi w sieci, poniżej zamieszczam dwa rozwiązania - wykuj się ich na pamięć, przyjdź do nas i pewnie dostaniesz posadkę ...
Rozwiązanie 1 - rekurencja - dużo zapytań do SQL, mało myślenia:
function lev($parent) {
$query = mysql_query('SELECT * FROM `_tree` WHERE `parent` = '.(int)$parent.' ORDER BY `sort` ASC');
if(mysql_num_rows($query)) {
echo '<ul>'."\n";
while($dane = mysql_fetch_array($query, 1)) {
echo '<li>'."\n";
echo $dane['nazwa']."\n";
lev($dane['id']);
echo '</li>'."\n";
}
echo '</ul>'."\n";
}
}
lev(0);
Rozwiązanie 2 - jedno zapytanie, nieco więcej myślenia:
function getData($parent) {
$query = mysql_query('SELECT * FROM `_tree` WHERE `parent` >= '.(int)$parent.' ORDER BY `parent` ASC, `sort` ASC');
$return = array();
while($dane = mysql_fetch_array($query, 1)) {
$return[] = $dane;
}
return $return;
}
function sortData($data, $root = 0, $level = 0) {
static $return = array();
foreach($data as $item) {
if($item['parent'] == $root) {
$item['level'] = $level;
$return[] = $item;
sortData($data, $item['id'], $level+1);
}
}
return $return;
}
foreach(sortData(getData(0)) as $item) {
echo str_repeat(' ', $item['level'] * 5).$item['nazwa'].'<br />';
}
Niech mi ktoś powie, że to jest mega skomplikowane? Dzisiaj pojawił się jeden człowiek, który był po 2 kierunkach na Politechnice Łódzkiej. Po godzinie nic nie zrobił. Drugi - stwierdził, że pracował w Prado (taki framework) - więc zainstalował sobie WAMP na laptopie, zassał Prado i ... po 2 godzinach wyszedł bez "do widzenia".
Wrzucam, bo może komuś się przyda - potrzebowałem generatora nr. dowodu osobistego do testowania aplikacji, która nie dość, że sprawdza poprawność to jeszcze nie pozwala na użycie tego samego numeru więcej niż raz. Kod PHP jest portem kodu Java z blogu Not All About Java.
function generateDO(){
$seria = $numer = "";
$suma=0;
$waga = array(7,3,1,7,3);
for($i=0;$i<3;$i++){
$seria .= chr(rand(0, (ord('Z') - ord('A'))) + ord('A'));
$suma += $waga[$i] * (ord(substr($seria, $i, 1)) - ord('A') + 10);
}
for($i=0;$i<5;$i++){
$numer .= chr(rand(0, ord('9') - ord('0')) + ord('0'));
$suma += $waga[$i] * (ord(substr($numer, $i, 1)) - ord('0'));
}
return $seria . ($suma%10) . $numer;
}
Od paru tygodni w wolnych chwilach klecę coś, czego mi, jako webdeveloperowi, zawsze brakowało. Czy często zdarza się wam dopytywać klienta o to, pod jaką przeglądarką i konfiguracją systemu strona źle się wyświetla? Ile razy dostaliście zrzut ekranu strony w 3 megowym pliku BMP? Ja za dużo ;-)

JakWyglada.pl to strona która w prosty sposób zbierze dla odwiedzającego informacje o jego przeglądarce, systemie operacyjnym, rozdzielczości czy obsłudze różnych technologii. Informacje te mogą następnie zostać przesłane na wskazany adres e-mail poprzez wypełnienie krótkiego formularza.
Dodatkową funkcjonalnością jest dołączenie do tych informacji zrzutu ekranu - można to oczywiście zrobić ręcznie - Prt Scr i dołączamy obrazek ze stroną i wszelkimi widocznymi informacjami do maila, ale można też wykorzystać opcje wbudowaną w aplikacje. Screenshot wykonywany jest przy użyciu appletu Java - niestety, z powodu ograniczeń bezpieczeństwa wymagane jest zaakceptowanie certyfikatu wystawionego imiennie przeze mnie. Gwarantuję, że applet nie robi nic innego niż zapisanie zrzutu ekran(ów*) jako plik %TEMP%\jakwyglada.jpg i wysłanie go do serwera strony wraz z danymi z formularza.
Oczywiście, jak to w Web 2.0 strona jest w wersji Beta - proszę o przesyłanie wszelkich uwag - zarówno co do wyglądu jak i funkcjonowania strony - czy to tu, czy też mailem na btm@anfo.pl.
* testowałem tylko w przypadku konfiguracji "monitor 1 po lewo, monitor 2 po prawo", jeżeli ktoś ma odwrotnie skonfigurowane monitory - o ile to nie duży problem, proszę o przetestowanie i podesłanie informacji, czy screenshot wykonany jest poprawnie. Wiem, że w przypadku takiej właśnie konfiguracji + MacOS "lewy" monitor ma ujemne współrzędne - jakie inne cyrki mogą wystąpić, nie wiem ;-)
Jako iż co raz większymi krokami zbliża się deadline większego projektu, szef poprosił mnie o zostawanie dłużej po pracy. Nie lubię pracować dłużej niż do 16, więc do pracy chodzę na 6-tą, kiedy większość z was przewraca się na kolejny boczek ;-)
Rozpoczęcie pracy 2 godziny przed innymi ma na mnie zbawienny wpływ - nagle nic mnie nie rozprasza, mogę spokojnie kończyć rzeczy, które po 8 zajmują mi parę razy więcej czasu - a to się ktoś o coś zapyta, zaprosi na herbatę czy opowie kawał. Wcześniej jestem ja i radio i praca idzie migiem.
Kolejna drobna zmiana to zakoszenie zakoszonego przez Marcina Kosedowskiego systemu TODO czyli Kółkowy system list. Wcześniej otoczony byłem masą kartek z kwadracikami, skreślonymi kwadracikami, zamazanymi kwadracikami, poprawionymi-by-wyróżniały-się-od-innych kwadracikami etc.
Teraz mam jedną lub dwie kartki z zamalowanymi kółkami. Naprawdę fajnie jest spojrzeć czasem na "fizyczną" reprezentację tego, jak nam idzie - widać ile jeszcze zostało( "( ) poprawki dla IE6"), a ile już jest za nami.