Niezalogowany [ logowanie ]
Subskrybuj kanał ATOM Kanał ATOM

Autor wpisu: batman, dodany: 13.08.2010 23:11, tagi: javascript, jquery

Ekipa odpowiedzialna za jedną z najlepszych bibliotek Javascript, powiadomiła o starcie nowego projektu – jQuery Mobile. Jego celem jest przygotowanie jQuery do poprawnego działania w przeglądarkach mobilnych. Co najważniejsze projekt ten zakłada, że nie będzie wydzielana specjalna wersja biblioteki, dzięki czemu nie trzeba martwić się o dołączenie odpowiedniej biblioteki zależnej od platformy.

Równolegle do prac nad podstawową biblioteką, trwają prace na jQuery UI. Wprowadzane zmiany mają na celu umożliwienie korzystanie z jQuery UI na większości przeglądarek mobilnych. Oprócz zmian umożliwiających wykorzystanie już istniejących kontrolek, w nowej wersji biblioteki znajdą się nowe kontrolki przygotowane specjalnie z myślą o urządzeniach przenośnych.

Wraz ze zmianami w podstawowej bibliotece oraz UI, pojawią się modyfikacje w ThemeRoller, narzędziu do tworzenia dedykowanych stylów. Programiści tworzący mobilne wersje stron będą mogli w kilka chwil dopasować wygląd kontrolek do aktualnie tworzonych stron.

źródło: blog.jquery.com

Autor wpisu: batman, dodany: 13.08.2010 08:00, tagi: php

Nie od dziś wiadomo, że PHP obsługuje operacje wejścia/wyjścia. Nic nie stoi na przeszkodzie, aby pisać aplikacje konsolowe, które “rozmawiają” z użytkownikiem. Generalnie wszystko sprowadza się do jednego wiersza kodu, który pobiera wpisany przez użytkownika tekst, a następnie zwraca go na przykład do zmiennej.

$input = trim(fgets(STDIN));
echo $input;

Dane od użytkownika można pobierać w pętli, dzięki czemu istnieje możliwość przeprowadzenia dłuższej konwersacji.

while(true) {
 echo 'Introduce yourself (to quit, type Q): ';
 $input = trim(fgets(STDIN));
 if($input === 'Q') break;
 echo "Your name is: " . $input . PHP_EOL;
}

echo 'Bye' . PHP_EOL;

Wprawdzie powyższy skrypt będzie w kółko nas pytał o imię, ale i tak jest to spory postęp w stosunku do pierwszego skryptu. Idąc dalej, można udostępnić użytkownikowi możliwość wywoływania funkcji (uwaga! kod jest nieco zabałaganiony – jego celem jest tylko prezentacja możliwości komunikacji z użytkownikiem).

echo 'Type function name to run (Q to quit): ';

$functionToCall = null;
$args = array();

while(true) {
 $input = trim(fgets(STDIN));
 if($input === 'Q') break;
 if($input === 'F') {
  echo call_user_func_array($functionToCall, $args);
  echo PHP_EOL;
  $functionToCall = null;
  $args = array();
  echo 'Type function name to run (Q to quit): ' . PHP_EOL;
  continue;
 }

 if($functionToCall === null) {
  $functionToCall = $input;
  echo 'Type function arg (F to finish): ';
 }
 else {
  echo 'Type function arg (F to finish): ';
  $args[] = $input;
 }
}

echo 'Bye' . PHP_EOL;

function Foo($arg1, $arg2)
{
 return 'Hello from Foo! - args: ' . $arg1. ', ' . $arg2;
}

function Bar()
{
 return 'Hello from Bar!';
}

Na koniec pozostawiłem ciekawą funkcjonalność – przekazywanie parametrów do skryptu.

echo 'Number of args passed: ' . $argc;
echo PHP_EOL;
echo 'Args passed: ';
print_r($argv);

Powyższy kod po wywołaniu go z wiersza poleceń z dodatkowymi parametrami

php skrypt.php -a -b "tekst ze spacjami" -c

wyświetli

Number of args passed: 5
Args passed: Array
(
    [0] => skrypt.php
    [1] => -a
    [2] => -b
    [3] => tekst ze spacjami
    [4] => -c
)

Pierwszym elementem tablicy jest nazwa wywołanego skryptu, kolejnymi – oddzielone spacjami parametry. Jeśli zmienne $argv oraz $argc z jakiegoś powodu nie zawierają żadnych danych, proponuję skorzystać z ich odpowiedników $_SERVER[‘argv’] oraz $_SERVER[‘argc’].

W ten oto prosty sposób można rozmawiać z PHP.

Autor wpisu: nospor, dodany: 11.08.2010 20:45, tagi: mysql

Miałem wczoraj nie lada zagwostkę. Chciałem wcielić w życie kod z mojego faq numer danego wiersza. Potrzebne mi to było do wyliczania pozycji danego posta. Jakież było moje zdziwienie gdy się okazało, że podzapytanie nie uwzględnia założonych indeksów. To samo zapytanie wykonane normalnie - działało bez problemu, łykało wszystkie indeksy. Wystarczyło jednak wrzucić je do podzapytania i już leciało po wszystkich rekordach.

Autor wpisu: batman, dodany: 11.08.2010 19:42, tagi: zend_framework

Problem “Select query cannot join with another table” jest dosyć powszechny, a jego rozwiązanie wyjątkowo banalne. Niemniej wymaga kilku/kilkunastu minut na analizę i wprowadzenie poprawki. Błąd pojawia się w momencie, gdy chcemy na obiekcie Zend_Db_Table_Select, skorzystać z metody join. Najprostszym obejściem tego problemu jest użycie metody setIntegrityCheck z argumentem false. Warto również pamiętać o przekazaniu do metody select argumentu true (Zend_Db_Table_Abstract::SELECT_WITH_FROM_PART), gdyż w przeciwnym razie zapytanie nie będzie zawierało klauzuli join. Poniżej prosty przykład.

$model = new Application_Model_Db_Foo();
$select = $model->select(Zend_Db_Table_Abstract::SELECT_WITH_FROM_PART);
$select->setIntegrityCheck(false);
$select->joinLeft(array('b' => 'bar'), 'b.id = idbar');

Autor wpisu: sokzzuka, dodany: 10.08.2010 22:44, tagi: php

W jednym z wpisów na php.internals w dyskusji o dacie wersji alpha releasu kolejnej wersji php (5.4 ?) Johannes Schlüter który jest release managerem dla brancha 5.3, zaproponował by publikacje nowych wersji języka przeprowadzać w pewnych konkretnych cyklach. Cykle wydawnicze php miały by być oparte o model cykli Ubuntu. Co to oznacza ? Mniej więcej tyle, że istniałby stabliny branch typu LTS (long term support) który żył by określoną z góry ilość czasu (np. 2 lata) i otrzymywał by przez ten czas tylko poprawki (np. 5.3), równolegle istniał by kolejny branch (5.4) z pewną ilością zmian w stosunku do poprzedniej wersji, który otrzymywałby poprawki do czasu aż nie wyszedł by kolejny (5.5) z nowymi featurami. Taka polityka ma kilka zasadniczych zalet:

  • szybkie wprowadzanie nowości do języka
  • większa motywacja dla deweloperów by nowości do języka wprowadzali sprawniej
  • określony cykl wydawniczy pozwalający końcowym użytkownikom prowadzenie efektywnej polityki migracji

Z ostatnich wpisów na liście wynika, że prawdopodobnie propozycja ta zostanie zaakceptowana, a nowe wersje języka będą pojawiały się raz do roku.

Co wy o tym sądzicie ?

Autor wpisu: sokzzuka, dodany: 10.08.2010 22:15, tagi: php

Nie jest to dokładnie kolejna część cyklu o Domain Driven Design, ponieważ nie zawiera żadnej konkretnej treści. Umieszczam tutaj kilka linków do artykułów o DDD wraz z krótkim opisem, które mogą okazać się przydatne dla wszystkich zainteresowanych tą metodyką. Życzę miłego czytania ;) http://msdn.microsoft.com/en-us/magazine/dd419654.aspx – MVP Microsoftu opisuje metodologie DDD na przykładzie aplikacji dla firmy ubezpieczeniowej, bardzo wartościowy artykuł

http://art-of-software.blogspot.com/search/label/Domain%20Driven%20Design – kopalnia wiedzy (po polsku!), niestety mało przykładów na żywym kodzie

http://www.opentaps.org/docs/index.php/Domain_Driven_Architecture – wiki z przykładową aplikacją

przykladowe aplikacje (wszystkie w c#) :

http://code.google.com/p/ndddsample/

http://myshop.codeplex.com/

http://dddpds.codeplex.com/

http://www.fincher.org/tips/General/SoftwareEngineering/DomainDrivenDesign.shtml – dziwnie wyglądający blog ale merytorycznie artykuł ok

http://www.developerfusion.com/article/9794/domain-driven-design-a-step-by-step-guide-part-1/ – seria o ddd

http://www.infoq.com/minibooks/domain-driven-design-quickly – książka o ddd do ściągnięcia

Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...

Autor wpisu: sokzzuka, dodany: 10.08.2010 09:49, tagi: php

Dzisiaj kolejny post z nieoficjalnej serii „zaprzyjaźnij się z PHP” :P a dokładnie z php 5.3. Opiszę w nim jak zbudować generator. Czym jest generator ? Jak wyjaśnia nam Wikipedia generator jest rodzajem Iteratora, który zamiast zwracać wygenerowaną wcześniej zawartość oblicza nam ją wraz z kolejnym przebiegiem, dzięki czemu nie musimy od razu pobierać np. całej zawartości jakiejś kolekcji. Nasz mały generator będzie implementował interfejs „Iterator” i pobierał w konstruktorze jako swój argument dowolną anonimową funkcję, która będzie generować kolejny wynik. Kod:

class Generator implements Iterator {
 
    protected $_function;
    protected $_maxN;
    protected $_n = 0;
 
    public function __construct($function, $maxN) {
        $this->_function = $function;
        $this->_maxN = $maxN;
    }
 
    public function current() {
        $fFunc = $this->_function;
        return $fFunc($this->_n);
    }
 
    public function key() {
        return $this->_n;
    }
 
    public function next() {
        $this->_n++;
    }
 
    public function rewind() {
        $this->_n = 0;
    }
 
    public function valid() {
        if ($this->_n < $this->_maxN) {
            return true;
        }
        return false;
    }
}

Nasz generator użyjemy do wygenerowania pierwszych n elementów ciągu fibonnaciego. Najpierw funkcja:

$cFib = function($n) use (&$cFib) {
            if ($n == 0) {
                return 0;
            }
            if ($n == 1) {
                return 1;
            }
            return $cFib($n - 1) + $cFib($n - 2);
        };

Jak widzimy jest to klasyczna implementacja funkcji obliczającej kolejny element ciągu fibonacciego. Z rzeczy które warto zauważyć – jest to domknięcie (closure) i aby funkcja mogła się rekurencyjnie wywołać musi dostać referencje do samej siebie (trochę jest to hak ale inaczej się nie da, __FUNCTION__ nie działa tak jak powinno).

Zastosowanie:

$oGenerator = new Generator($cFib, 5);
foreach($oGenerator as $n => $value){
    echo $n, ' ', $value, '<br/>';
}

Wynik: 0 0 1 1 2 1 3 2 4 3

Koniec końców uzyskaliśmy wygodną klasę do generowania kolejnych wartości. Przy odrobinie większym wysiłku, można by do implementować jeszcze interfejs ArrayAccess i mieć już całkowitą iluzję obcowania z tablicą -

echo $oGenerator[4];
//zwroci 3
Wszystkie wpisy należą do ich twórców. PHP.pl nie ponosi odpowiedzialności za treść wpisów.