Autor wpisu: sokzzuka, dodany: 22.03.2011 22:38, tagi: javascript, php
Kolejny odcinek serii o języku Scala zajmie się kwestią traits – cech. Jest to o tyle ciekawa część języka, że w PHP również zostaną one wprowadzone w najbliższej wersji 5.4 . Traits w PHP zainspirowane zostały właśnie bezpośrednio implementacją z Scali.
Czym jest trait ? Trait jest elementem języka służącym do zapewnienia dziedziczenia poziomego. Co oznacza dziedziczenie poziome ?
Ażeby dowiedzieć się czym jest dziedziczenie poziome, najpierw musimy ustalić czym jest dziedziczenie pionowe. Dziedziczenie pionowe, takie jakie znamy np. z PHP i Javy zakłada, że każda klasa potomna może dziedziczyć tylko z jednej klasy bazowej. Wszelkie metody i pola oznaczone przez „protected
” obecne są też w klasie potomnej. Jednak co najważniejsze – klasa potomna jest podtypem klasy bazowej. Dziedziczenie oznacza, że klasa B jest również typu A .Ilustruje to poniższy przykład hierarchii klas znany z lekcji biologii:
Zwierzęta -> Strunowce -> Kręgowce -> Ssaki -> Walenie -> Delfiny -> Delfin Słodkowodny
Dziedziczenie poziome natomiast jest sytuacją gdy jakiejś klasie chcemy rozszerzyć funkcjonalność nie zaburzając wcześniej przedstawionej pionowej hierarchii klas. Weźmy dla przykładu naszego delfina i jego kolegę po miedzy – szympansa. Załóżmy, że chcemy zarówno delfina jak i szympansa nauczyć jakiś sztuczek np. salta w tył. Oczywiście moglibyśmy dodać metodę „salto w tył” abstrakcyjnej klasie „ssaki” z której dziedziczą szympans i delfin lub dodać kolejną klasę pośrednią. Natomiast pada pytanie jaki ma to sens ? W końcu tylko szympansy i delfiny umieją takie śmieszne sztuczki, natomiast inne ssaki nie są na tyle sprytne, żeby to wykonać. Generalnie wtłaczanie takiej cechy w dziedziczenie pionowe jest działaniem troszkę „na siłę”. Na szczęście mamy traity zwane też cechami. Traity w dowolnej ilości można „wczepić” do dowolnej klasy.
Traity często opisywane są jako interfejsy posiadające implementacje. Jest to dobre skojarzenie – implementacja przez jakąś klasę interfejsu oznacza, że posiada ona pewną funkcjonalność. Dołączenie traita do klasy znaczy dokładnie to samo, z tą różnicą, że trait może posiadać konkretną implementację.
Najwyższy czas pokazać, jak traity wykorzystywane są w praktyce w języku Scala. Trait, który przedstawię, będzie posiadał tylko jedną metodę – „toArray”. Będzie ona zwracała wszystkie zmienne istniejące w obiekcie w postaci obiektu klasy HashMap, który jest odpowiednikiem PHP-owego „arraya
„. Przy okazji dowiemy się co nieco o refleksji oraz o domknięciach leksykalnych i iteracji.
Kod:
trait ToArray { def toArray: HashMap[String, Any] = { val vars = new HashMap[String, Any]() val className = this.getClass.getName def extractFields(className: String):HashMap[String, Any] = { val currentClass = java.lang.Class.forName(className) val superClass = currentClass.getSuperclass if(superClass == null){ return vars } val fields = currentClass.getDeclaredFields fields.foreach((field:java.lang.reflect.Field) => { field.setAccessible(true) val name = field.getName val value = field.get(this) vars += name -> value field.setAccessible(false) }) return extractFields(superClass.getName) } extractFields(className) return vars } }
Metoda „toArray
” jest funkcją zwracającą obiekt typu HashMap
, gdzie klucz ma postać tekstową (String
), natomiast wartość może być dowolnego typu (Any
), jest ona również zadeklarowana jako stała – „vars
„.
By pobrać nazwę klasy, w której znajduje się trait, używamy metody this.getClass
, która zwraca nam Javowy obiekt reprezentujący klasę. Posiadający metodę, która zwraca nam jej nazwę „getName
„. Następnie zdefiniowana jest funkcja extractFields
, która jest jednocześnie domknięciem – importuje do swojego kontekstu stałą „vars
„. Rekurencyjnie przemieszcza się ona w górę hierarchii klas i pobiera listę zadeklarowanych pól i dołącza je do stałej vars. Pragnąłbym zwrócić tutaj szczególną uwagę na sposób w jaki jest dołączany kolejny element do „arraya
„. W PHP zrobilibyśmy coś takiego:
Autor wpisu: batman, dodany: 18.03.2011 12:00, tagi: javascript, jquery
jStat to kolejna interesująca biblioteka stworzona na bazie jQuery. Dzięki niej możemy wykonywać obliczenia statystyczne bez konieczności korzystania z takich narzędzi jak na przykład MATLAB. Ile jest w tym prawdy niestety nie wiem, ponieważ statystyką ostatni raz zajmowałem się na studiach.
Do poprawnego działa jStat wymaga jQuery, jQuery UI oraz flot. To ostatnie to plugin do jQuery pozwalający na generowanie wykresów. Biblioteka poprawnie działa na wszystkich nowoczesnych przeglądarkach oraz IE7 i IE8, dzięki czemu bez obaw możemy z niej korzystać w naszych projektach.
Bibliotekę znajdziecie pod adresem http://www.jstat.org/
Autor wpisu: Kamil, dodany: 18.03.2011 03:01, tagi: javascript
Autor wpisu: singles, dodany: 16.03.2011 19:06, tagi: css, javascript
Na rynku przeglądarek internetowych można wyróżnić „Wielką Piątkę” – należą do niej: Firefox, Opera, Safari, Chrome oraz Internet Explorer, vel Twoja Nowa ;). Każda z tych przeglądarek posiada tzw. zestaw narzędzi developerskich. Uważam, że śmiało można powiedzieć, że prawdziwy rozwój narzędzi tego typu rozpoczął się od rozszerzenia Firefoxa: Firebug – będącego do dzisiaj najbardziej popularnym narzędziem tego typu – dla niektórych wręcz niedoścignionym wzorem. Lecz nie o Firebugu będzie ten wpis, tylko o nowej wersji operowej ważki – Opera Dragonfly – zestawu narzędzi deweloperskich przeznaczonych dla tej norweskiej przeglądarki.
Instalacja
Słowo „instalacja” zostało tutaj użyte jako metafora, ponieważ nie musimy nic instalować (poza Operą oczywiście ;) bądź ściągać uaktualnień. Wystarczy w pasku przeglądarki wpisać opera:config#DeveloperTools|DeveloperToolsURL
, a w podświetlonym polu podać następujący adres: https://dragonfly.opera.com/app/cutting-edge/
. Po zapisaniu konfiguracji możemy już korzystać z nowej wersji narzędzia wybierając narzędzia deweloperskie z menu bądź korzystając ze skrótu klawiszowego Ctrl + Shift + I
.
Wygląd
Znacznej poprawie uległ wygląd w porównaniu do poprzedniej wersji, co dobrze oddają poniższe screeny. Teraz Dragonfly przypomina WebInspectora z WebKita.
Poszczególne opcje zostały zdecydowanie lepiej pogrupowane, otrzymały ikony, konsola pojawia się na półprzezroczystej warstwie – tak samo opcje. Wszystko wygląda schludniej i zdecydowanie łatwiej znaleźć to czego szukamy.
DOM
Dostajemy prawie wszystko, do czego zdążyliśmy przyzwyczaić się używając FireBuga. Czyli drzewo dokumentu, a z prawej strony wyliczone listę zastosowanych stylów (także w postaci obliczonej), właściwości elementu oraz jego układ. Dodatkowo w ostatniej wymienionej zakładce mamy listę elementów wyznaczających offset danego elementu.
Niestety, nie ma możliwości edycji parametrów elementu z poziomu zakładki Układ – możliwe jest to tylko z zakładki Style. Z ciekawostek – po kliknięciu prawym przyciskiem na nazwie właściwości CSS, jedna z opcji brzmi Specyfication for [nazwa właściwości. Po wybraniu tej opcji zostajemy przekierowani do dokładnego opisu danej właściwości na stronie W3C.
Autor wpisu: Kamil, dodany: 12.03.2011 03:18, tagi: javascript
Autor wpisu: batman, dodany: 28.02.2011 08:00, tagi: css, javascript
W weekend wookieb podesłał linka do interesującej biblioteki JavaScript – Modernizr. Dzięki niej wykrycie jakie funkcjonalności obsługuje nasza przeglądarka to pestka. Co więcej, nie napiszemy ani jednej linijki w JavaScript. Jedyne co musimy zrobić, to dodać bibliotekę do strony i… cieszyć się efektami. Modernizr na podstawie wykrytych funkcjonalności, do tagu HTML doda klasy CSS jednoznacznie opisujące czego możemy spodziewać się po przeglądarce. W pliku ze stylami możemy wykorzystać nowe klasy do zastosowania rozwiązań zapasowych. Prosty przykład:
.multiplebgs div p { /* properties for browsers that support multiple backgrounds */ } .no-multiplebgs div p { /* optional fallback properties for browsers that don't */ }
Po więcej szczegółów odsyłam na stronę biblioteki – www.modernizr.com