Autor wpisu: batman, dodany: 18.11.2010 09:00, tagi: jquery, javascript
Nie lada gratka dla wszystkich zainteresowanych jQuery pojawiła się ostatnio w Internecie. Mowa o jQuery 1.4.3 Offline Learning Kit, czyli pakiecie do nauki jQuery offline. Pakiet ten jest całkiem spory i swoim zakresem obejmuje:
- spis selektorów wraz z ich dokładnym opisem
- cheet sheet zawierający listę wszystkich dostępnych funkcji
- jQAPI pozwalające na przeglądanie dokumentacji offline
- demonstracyjną aplikacją korzystającą z jQuery Mobile
- książkę jQuery Fundamentals book wraz z przykładami
- pliki źródłowe z jQuery 1.4.3 oraz 1.4.4 RC
Wszystkie materiały dostępne są w języku angielskim.
jQuery 1.4.3 Offline Learning Kit można pobrać pod adresem http://addyosmani.com/blog/jq143offlinelearningkit/
Autor wpisu: sokzzuka, dodany: 16.11.2010 11:46, tagi: php
Galen Wright-Watson kilka dni temu ogłosił, że napisał łatkę, która włącza tzw. short open echo tag niezależnie od ustawień w php.ini. Co to oznacza w praktyce ? Oznacza to, że jakkolwiek nie powinniśmy pisać <? $foo = 'bar' ?>
to <?=$foo ?>
będzie jak najbardziej dozwolone i nie będzie można go wyłączyć. Dzięki temu, programiści, którzy używają czystego PHP w widoku będą mieli mniej pisania . Prawdopodobnie ten pomysł przejdzie, bowiem sam Rasmus Lerdorf znany też jako BDFL PHP przychylnie odniósł się do tego pomysłu. Prawdopodobnie będziemy mogli już z tego skorzystać w nadchodzącym wydaniu 5.4.
Autor wpisu: Wojciech Sznapka, dodany: 16.11.2010 03:01, tagi: php
Autor wpisu: sokzzuka, dodany: 13.11.2010 19:38, tagi: php
Ekipa „internalsów” puściła chyba wodzy fantazji – Kenan Sulayman rozpoczął wątek o wprowadzeniu akceleracji GPU do PHP. Rzecz może wydawać się trochę zaskakująca, bo jak w generowaniu stron www może pomóc karta graficzna ? Otóż jest kilka zastosowań.
Oprócz oczywistych rzeczy takich jak funkcje przetwarzające obrazki, jest jeszcze druga grupa funkcji – funkcje operujące na tablicach. Weźmy sobie tak popularną funkcję jak in_array()
, nie jestem pewien jak ona jest do końca zaimplementowana, ale sądzę, że po prostu jest iterowana cała tablica i każdy jej element jest porównywany z szukaną wartością. Wyobraźmy teraz sobie, że po zastosowaniu akceleracji GPU, zamiast iterować po całej tablicy, równolegle wykonane jest porównanie szukanej wartości z każdym z elementów tablicy. Teoretyczne przyspieszenie dla tablicy, która ma 512 elementów, na GPU, który ma 512 procesorów wyniosło by 512x.
Powiedzmy sobie szczerze, takie przyśpieszenie powoduje małe WOW wśród zgromadzonej publiki . Pojawia się pytanie, czy jest to możliwe w praktyce do osiągnięcia? Z pewnością w dużej mierze zależy to od sposobu implementacji.
Stass Vass podszedł do sprawy bardziej pragmatycznie. Stwierdził, że pierwszą rzeczą jaką należało by zrobić w kwestii przyspieszenia PHP to dołączenie APC do standartowej dystrybucji. Następnie zintegrowanie go bezpośrednio z Zend Engine’em a na koniec dołożenie kompilacji JIT (Just In Time), co podobno już było próbowane przy pomocy LVVM-a. Dopiero po tych wszystkich przyśpieszeniach ma sens jakakolwiek akceleracja przy pomocy GPU.
Widać więc, że przynajmniej niektórzy deweloperzy PHP mają jasną wizję na temat tego co trzeba zrobić by uczynić PHP szybszym. Pytanie czy uda im się przeforsować swoje koncepcje oraz zaimplementować je z powodzeniem.
Jak zwykle czekam na Wasze komentarze dotyczące tych jakże interesujących nowinek.
Autor wpisu: sokzzuka, dodany: 12.11.2010 09:24, tagi: php
Już od dłuższego czasu przymierzam się do spełnienia obietnicy z początku cyklu o Domain Driven Design jaką jest zademonstrowanie przykładowej aplikacji napisanej w metodyce DDD. W ciągu tych trzech miesięcy jakie minęły od pierwszego wpisu wielokrotnie podejmowałem próby napisania czegoś. Jednak nigdy nie było ani jakiegoś konkretnego tematu na taką aplikację ani za bardzo czasu na ruszenie z developmentem (magisterka, wakacje etc). Natomiast od kilku dni czuję, że nadszedł właściwy czas i temat.
Temat
Jaki więc będzie cel działania naszej aplikacji? Jej tematem jest system relacji meczowych. Cóż to w ogóle jest ? Aby odpowiedzieć na to pytanie trzeba najpierw wyjaśnić skąd wzięła się motywacja.
Motywacja
Jednym z projektów, którym ostatnio się zajmowałem był CMS dla pewnego klubu sportowego. Oprócz standardowych funkcji, klient zażyczył sobie, by mógł przeprowadzać relację na żywo w internecie. Ficzer miał powstać na wzór tych, które funkcjonują na interii czy onecie. W zasadzie prosta sprawa – mamy mecz pomiędzy drużynami, obie drużyny mają jakiś skład, a jak już grają, to na boisku odbywają się różnego rodzaju wydarzenia – padają gole, sędzia pokazuje kartki etc. Jak na prostą sprawę przystało, długo się nie zastanawiałem. Zaprojektowałem bazę danych z odpowiednimi relacjami. Stworzyłem jedną ładną klasę która wszystko obsługiwała (w zasadzie można było to napisać jako zestaw pojedynczych funkcji) i po robocie. Działało ładnie, szybko i sprawnie. Do czasu. Do czasu gdy okazało się, że potrzeba jeszcze kilka rzeczy – tabelę ligową, podsumowania spotkań, że istnieją gole samobójcze, a potem jeszcze kilku zmian.
W zasadzie przyznam się szczerze, że się skompromitowałem w pewnym sensie – gram na różnych szczeblach klubowej piłki już kilka lat i temat znam nie od dziś. Niestety informacje jakie do mnie spływały w ogóle nie zapowiadały takiego obrotu spraw. Tak jak mówiłem miała to być prosta sprawa i tak zostało to zaimplementowane. Moim najpoważniejszym błędem było to, że w porę nie zaświeciła mi się w głowie taka mała czerwona lampka, że coś jest tutaj nie tak.
Motywacją jest więc chęć zrobienia TEGO dobrze. Żeby zrobić coś dobrze, trzeba wiedzieć najpierw jednak co poszło nie tak ?
Co poszło nie tak ?
Jak pamiętamy z poprzednich wpisów, metodyka DDD zakłada, że osoba projektująca software ma dostęp do eksperta domeny. Niestety w tym przypadku tak nie było. Informacje na temat funkcjonalności nie trafiały do mnie bezpośrednio. Fakt ten pewnie przyczynił się do ich zniekształcenia w drodze przekazu. Sądzę jednak, że nie było to największym problemem. Mam wrażenie, że gdybym osobiście mógł rozmawiać z tym ekspertem domeny to w mógłbym ogarnąć całą jego wizje. Sądzę również, że rozmawiając z ekspertem osobiście, czerwona lampka o której mówiłem, zapaliła by się na samym początku i mógłbym to zaprojektować w lepszy sposób. Największym problemem braku żywego kontaktu z ekspertem domenowym jest to, że wszelkie informacje docierają do nas w postaci „strzępków”. Rozmawiając na żywo czy na telekonferencji z kimś, możemy na bieżąco zadawać pytania i weryfikować nasze wątpliwości.
Z powodu tej dezinformacji rozpocząłem projektowanie modułu meczowego od strony bazy danych. Ten sposób projektowania software’u ma jednak jedną podstawową wadę – utrudnia przeprowadzanie zmian. Wprowadzenie zmian w bazie danych jest trudniejsze z perspektywy utrzymania spójności danych. Mając już zrobione relacje w bazie danych wszelkie zmiany muszą je uwzględniać, nie można sobie tak ot zmienić nagle relacji w ustalonym schemacie. Poza tym zauważyłem (przynajmniej u mnie), że projektowanie od strony bazy skłania raczej do dodawania nowych pól w tabelach niż tworzeniu nowych. Przykładem niech będą zdarzenia meczowe (Event). Załóżmy, że na początku zaprojektowaliśmy zdarzenie meczowe jako tabele z polami (id, time, content, type)
gdzie time to minuta meczu, content to opis akcji, a type to rodzaj zdarzenia (gol, kartka etc) potrzebny do wyświetlenia odpowiedniej ikonki przy zdarzeniu. Dla celów statystyk postanawiamy dodać pole player_id
, będzie mówiło nam który zawodnik dostał kartkę czy strzelił gola, oczywiście dla zwykłych eventów to pole nie jest do niczego potrzebne. Kolejną rzeczą, która potrzebujemy do statystyk będzie pole player2_id
, potrzebne ono będzie do tego by wiedzieć którzy zawodnicy uczestniczyli w zmianie. Tak jak wcześniej pole to pozostałym rodzajom eventów nie jest do niczego potrzebne. Tak się dzieje z każdym kolejnym przypadkiem. W przypadku projektowania obiektowego każdy rodzaj eventu będzie kolejną klasą.
Podsumowanie
Pewnie w tej chwili część osób czytających ten tekst myśli sobie „…no tak nie zrobił tego obiektowo teraz mu nie działa…”. Jak na złość muszę powiedzieć, że to nieładne rozwiązanie mimo wszystko działa. Problemem jest tylko rozwijanie tego kodu. Szczęście, że nie jest go dużo, ale sądzę, że gdyby to zaczęło się rozrastać to w końcu doszlibyśmy do stanu zwanego Big Ball Of Mudd . Na szczęście, pisząc tą przykładową aplikację będę w razie czego przygotowany gdyby praca z tamtym kodem stała się już nie możliwa.
Wpis zrobił się już dość długi, więc go w tym momencie zakończę i zapraszam na kolejną część, która opublikuje za kilka dni. Na pewno będzie to już coś bardziej konkretnego
Autor wpisu: sokzzuka, dodany: 12.11.2010 09:20, tagi: php
Oj gorąco ostatnio jest na liście php.internals. Co chwilę coś się ciekawego dzieje, ostatnio na tapecie mamy binarną notację dla liczb całkowitych. Jonah H. Harris zaproponował, by oprócz możliwości wpisywania liczb w systemie 8-mkowym, 10-tnym czy 16-tkowym można było wpisywać liczby całkowite w systemie binarnym. Powstało oczywiście odpowiednie RFC. Chyba wszystkim na liście dyskusyjnej ten pomysł się spodobał i wygląda na to, że łatka wprowadzająca tą funkcjonalność już niedługo wyląduje w „trunku”.
Jak by to miało wyglądać ? Dla porównania zapis liczby 2010 w trzech dotychczas obsługiwanych systemach zapisu i nowym binarnym:
- 8: 03732
- 10: 2010
- 16: 0x7da
- 2: 0b11111011010 lub jako flagi – 0b00001, 0b00010, 0b00100, 0b01000, 0b10000
Jak dla mnie ten nowy „ficzer” jest całkowicie zbędny, jednak domyślam się, że dla niektórych okaże się przydatny. Szkoda, że chłopaki nie pomyśleli o jakimś bardziej generycznym zaprojektowaniu tego. Mam na myśli coś w stylu rNxLICZBA. Gdzie N to podstawa systemu liczbowego a LICZBA to liczba zapisana w tym systemie. Wtedy dla binarnego zapisu było by coś w rodzaju r2x01010101 a dla 16-tkowego r16x7da.