Autor wpisu: batman, dodany: 23.03.2010 22:05, tagi: zend_framework
Autor wpisu: cojack, dodany: 21.03.2010 18:20, tagi: sql
Ostatnimi czasy coś nie mam weny by napisać cokolwiek na blogu, także postanowiłem tym razem coś może o postgresql napisać i jego własnościach tudzież mowa o widokach w postgresql. Rzecz biorąc czym jest widok? Widok jest niczym innym jak zapytaniem kryjącym się pod krótką nazwą, jak pisałem w wcześniejszej notce o RBAC cz.3 z pewnego zapytania można było utworzyć sobie widok. Może więcej szczegółów technicznych, składnia widoku ma się tak:
CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] VIEW name [ ( column_name [, ...] ) ] AS query
Sama składnia może się wydawać prosta choć nie musi ;] składnia podana w nawiasach kwadratowych jest opcjonalna. Prze zemnie rzadko wykorzystywana, bo nie tworzę jakiś tymczasowych widoków, nie zapisuję widoku do innego schematu niż ten w którym się znajduję ani też nie używam OR REPLACE gdyż jak instaluje na nowo to drop db i amba.
Teraz może co do samej składni
OR REPLACE – co dziwnego o tym piszą w manualu, to się można dowiedzieć na stronie podanej poniżej. Ale przytoczę fragment.
CREATE OR REPLACE VIEW is similar, but if a view of the same name already exists, it is replaced. The new query must generate the same columns that were generated by the existing view query (that is, the same column names in the same order and with the same data types), but it may add additional columns to the end of the list. The calculations giving rise to the output columns may be completely different.
I teraz pytanie, po czorta w takim razie OR REPLACE jeżeli zmienimy sobie całkowicie widok a pozostawimy tą samą nazwę, trochę dziwna akcja, chociaż może nas to też z jednej strony zabezpieczać przed nałogowym wstawianiu OR REPLACE i nie daj Bóg strzelimy gdzieś dwa takie same nazwy widoków, hmmm w sumie może i dobrze.
Przykład jakiegoś widoku? Proszę bardzo, z naszego RBAC’a z zapytania sprawdzającego uprawnienia, zróbmy sobie teraz widok:
CREATE VIEW "checkRightView" AS SELECT "allow", "u2g"."idUser", "m"."moduleName", "a"."actionName" FROM "rbac_privilages" p LEFT JOIN "rbac_module" m ON ( p."idModule" = m."idModule" ) LEFT JOIN "rbac_action" a ON ( p."idAction" = a."idAction" ) LEFT JOIN "rbac_user_to_group" u2g ON ( p."idGroup" = u2g."idGroup" );
Dodaliśmy tylko nagłówek create view i ucięliśmy klauzule where, a teraz przykład jak takiego widoku użyć:
SELECT "cRV"."allow" FROM "checkRightView" AS "cRV" -- prawie jak honda ^^ WHERE "cRV"."idUser" = 2 AND "cRV"."moduleName" = 'music' AND "cRV"."actionName" = 'index';
Tadam, proste prawda? Tworzenie widoków można by porównać do polimorfizmu, lecz nim nie jest. Co nam to daje? Na pewno przejrzyste zapytania sql, co do debugowania to w sql zawsze był z tym problem, dlatego przed utworzeniem widoku pierw lepiej sprawdzić czy zapytanie śmiga.
Co do ograniczeń widoku, wiążą się z tym pewne niedogodności, gdyż jak widać by mieć dostęp do tabel łączonych w zapytaniu, trzeba pobrać ich elementy w samym zapytaniu (w widoku) by mieć do nich dostęp przy wywoływaniu widoku. Cóż jak to uważam za pewne ograniczenia, czy nim jest teoretycznie? Nie mam takiej wiedzy by to stwierdzić.
Autor wpisu: m1chu, dodany: 19.03.2010 22:14, tagi: javascript
Serwisów oferujących przeglądanie zasobów multimedialnych nie brakuje w sieci. Do niedawna jednak wszystkie oparte były o wykorzystanie możliwości znaczników object
lub niepoprawnego embed
. Problem w tym, że rozwiązania te opierały się o wtyczki firm trzecich, takie jak QuickTime, czy Flash. HTML 5 standaryzuje osadzanie plików muzycznych i filmów.
Kwestia dźwiękowa: element AUDIO
Jedna z najbardziej, od dawna oczekiwanych możliwości w HTML 5. Pozwala na natywne odtwarzanie utworów muzycznych w przeglądarce. Określana znacznikiem audio
.
Wg. specyfikacji może przyjmować pięć atrybutów:
autoplay
– określa czy odtwarzać automatycznie dźwięk, gdy zostanie on załadowany,controls
– określa czy wyświetlić odtwarzacz w standardowym układzie,loop
– określa czy powtarzać odtwarzanie,preload
– wyznacza, czy załadować zasobów w trakcie ładowania strony,src
– adres URL do pierwotnego, ładowanego źródła.
Korzystając z powyższych informacji możemy otrzymać następujący przykład:
<!-- domyślny układ, startuje automatycznie, jedno źródło --> <audio src="test.ogg" controls autoplay></audio>
W praktyce pojawi się jednak problem, związany z implementacją różnych wersji kodeków w przeglądarkach (np. Vorbis, Advanced Audio Coding, MPEG-1 Audio Layer 3). Z tego powodu, trzeba aktualnie definiować dodatkowe zasoby w tagu source
. Obsługuje on atrybuty:
media
– zdefiniowanie typu zasobu. Domyślnie odpowiada wszystkim typom mediów,src
– adres URL do pierwotnego, ładowanego źródła,type
– definiuje typ zasobu, pozwalając na określenie przeglądarce, czy może odtworzyć go, bez konieczności pobierania. Musi być pod postacią prawidłowego typu MIME. Opcjonalnie, wewnątrz niego można zdefiniować parametrcodecs
, określający jak zakodowany jest zasób.
<!-- domyślny układ, startuje automatycznie, wiele źródeł --> <audio controls autoplay> <!-- Firefox ge 3.5, Chrome ge 3 beta, Opera ge 10.5 --> <source src="test.ogg" type="audio/ogg; codecs=vorbis"> <!-- Safari ge 4, Chrome ge 3 beta --> <source src="test.mp3"> <!-- Opera ge 10.5, Firefox ge 3.5 --> <source src="test.wav"> </audio>
Na wypadek niekompatybilnej przeglądarki można wewnątrz elementu audio
wstawić alternatywną wiadomość, bądź plik Flash z autorskim odtwarzaczem.
<!-- domyślny układ, startuje automatycznie, wiele źródeł --> <audio controls autoplay> <!-- Firefox ge 3.5, Chrome ge 3 beta, Opera ge 10.5 --> <source src="test.ogg" type="audio/ogg; codecs=vorbis"> <!-- Safari ge 4, Chrome ge 3 beta --> <source src="test.mp3"> <!-- Opera ge 10.5, Firefox ge 3.5 --> <source src="test.wav"> <!-- alternatywny wynik --> Twoja przeglądarka nie obsługuje HTML 5. </audio>
W rozwiązaniu powyższego problemu pomóc może także użycie możliwości JavaScriptu i metod/atrybutów/zdarzeń dostępnych w API. Pozwalają one na manipulację na obsługiwanych plikach. Niestety skorzystanie z możliwości obiektu Audio
nie będzie możliwe w jakiejkolwiek wersji IE.
buffered
– określa ilość oraz początkowy i końcowy czas zbuforowanego zasobu,canPlayType(typ_MIME)
– zwraca informacje na temat tego, czy dany typ obsługiwany jest przez klienta. Możliwe wyniki to: no, maybe, probably,currentTime
– pozwala na ustawienie lub pobranie aktualnego czasu odtwarzania,duration
– wyświetla czas trwania utworu. W wypadku nie załadowania go, zwraca NaN (Not a Number),ended
– zwraca prawdę, jeżeli zakończono odtwarzanie (w przód),loop
– wartość logiczna, pozwalająca na zapętlanie dźwięku,muted
– zwraca lub ustawia, czy kanały audio są wyciszone,pause()
– pauzuje odtwarzanie,paused
– przetrzymuje informacje o tym, czy element jest spauzowany,play()
– wznawia odtwarzanie,played
– przetrzymuje informacje o odtwarzanym elemencie,volume
– zwraca lub ustawia głośność dźwięku w zakresie od 0.0…0.1.
Przykład: