Category Archives: php

De beściak

Czasem lubię się pastwić nad ludźmi, czasem nad kodem. Nad ludźmi bywa kiepsko, bo może to być nielegalne. Nad kodem lepsiej, bo może to stanowić niezłe ćwiczenie. Ostatnio mnie trafiło, jak zobaczyłem commenta o wdzięcznym brzmieniu:

Eddy Vlad
24-Nov-2009 04:59
The shortest recursive delete possible.


/** 
* Delete a file or recursively delete a directory * 
* @param string $str Path to file or directory 
*/ 
function recursiveDelete($str)
{ 
  if(is_file($str))
  { 
     return @unlink($str); 
  } 
  elseif(is_dir($str))
  { 
    $scan = glob(rtrim($str,'/').'/*'); 
    foreach($scan as $index=>$path)
    {
      recursiveDelete($path);
    }
    return @rmdir($str);
  }
}

Kilka minut zabawy i wymodziłem coś takiego:


function rrmdir($path)
{
  return is_file($path)?
    @unlink($path):
    array_map('rrmdir',glob($path.'/*'))==@rmdir($path)
  ;
}

Wspomoże ktoś czymś jeszcze krótszym?

Skrętność wielokątów

Dziś geometria ;P

W pracy ostatnio pojawił się problem – czy wierzchołki wielokąta są ułożone zgodnie z kierunkiem ruchu wskazówek zegara czy wręcz przeciwnie? Potrzebna była szybka i tania (w sensie obliczeniowym) metoda określenia owego ułożenia.

skretny

Ok, patrząc na obrazek widzimy od razu ;P A programowo?

Jak widać na rysunku wyznaczamy sobie 4 (w pewnych szczególnych przypadkach 3) punkty brzegowe – górny, prawy, dolny, lewy – opisując prostokąt na wielokącie. Znalezienie tych punktów jest proste i tanie – wystarczy raz przejrzeć listę współrzędnych.

Zapisujemy sobie numery tych punktów prawoskrętnie do array-a: 1,2,7,9. Jeśli ciąg jest rosnący – mamy prawoskrętny. Jeśli malejący – lewoskrętny.

Ok, a co, jeśli nam się figura obróci o 180 stopni i dostaniemy: 7,9,1,2 ? Ciąg nie jest już rosnący ;P Rozwiązań jest parę. Można szukać punktu nieciągłości i próbować splice tablicy zrobić i merge potem. Można sprawdzić, jaki jest największy element w tablicy i dodać taką wartość do wszystkich mniejszych. Przy 4 elementach będzie to nadal szybkie i proste: 7, 9, 10(1+9), 11(2+9).

Jak sprawdzić, czy ciąg jest rosnący?

$up = $points;
sort($up);
if(join($up)==join($points))
{
echo "rosnący";
}

Cała operacja jest prosta i szybka – zależna liniowo od ilości wierzchołków wielokąta.

Wielokrotne dziedziczenie w PHP

Stanowczo powinienem organizować sobie czas tak, aby nie mieć szans na nudę ;P

Znów wieczorne dłubanie w PHP zaowocowało próbą obejścia ograniczeń narzuconych na język przez twórców. Tym razem padło na wielokrotne dziedziczenie. Było mi potrzebne kiedyś-kiedyś, lat temu parę, teraz już wiem, że nie jest potrzebne do szczęścia, lepiej i czytelniej można wszystko zrobić bez MI. Ale potraktowane jako ćwiczenie jest niezłą ciekawostką. Kody źródłowe na podstronie.

PHP Prefixowanie w nazwach metod

Pojawił się dziś pomysł na realizację prostych wrapperów na metody (np do pomiaru czasu czy debugowania) nie poprzez zewnętrzne funkcje czy dekoratory tylko poprzez dodawanie prefixów w nazwach metod.
Rozwiązanie oparte jest na magicznej metodzie __call i zawiera się w dosłownie kilku liniach kodu. Szczegóły w pełnym artykule.

PHPowy wieczór

Wczorajszy wieczór był dość owocny, jeśli chodzi o kodowanie ;D

Popełniłem 2 małe projekty, które właściwie są narazie bardziej koncepcjami niż produktami nadającymi się do pełnego wykorzystania, ale powiedzmy, że działają.

Pierwszy z projektów to próba zaimplementowania pseudowątków w PHP. Działa wolno, ale skutecznie. Na podstronie kod i przykład wykorzystania.

Drugi, to implementacja prostego mechanizmu RPC pośredniczącego w korzystaniu ze zdalnych obiektów umieszczonych np na innych serwerach. Może się przydać do pobierania niedużych ilości danych, sterowania procesami czy zdalnej autoryzacji. Dużą zaletą jest prostota korzystania. Obiekt po zdefiniowaniu korzysta ze zdalnej maszyny w sposób całkowicie przezroczysty. Na podstronie kod i przykład wykorzystania.

Zend Framework

Ładny, funkcjonalny.

Jeszcze trochę dokumentacja musi dojrzeć.

Jedno co mnie zaszokowało, to funkcjonalność. Jest mniejsza, słabiej przemyślana niż moje własne rozwiązania ;/
Jedyną przewagą ZF jest większy porządek w samym kodzie.

Uwagi praktyczne:

– domyślnie w debianie nie instaluje się php5-pdo-mysql. warto zainstalować. może oszczędzić paru minut zastanawiania się, dlaczego to #^@%$@# nie działa! ;D