<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"><channel><title>b4rtaz.blog</title><link>http://b.nano2.pl/</link><description>Wpisy z dziennika internetowego Jogger, wspomaganego przez Jabbera</description><lastBuildDate>Thu, 29 Jul 2010 05:01:43 +0200</lastBuildDate><generator>JoggerPL</generator><item><title>Wrzuta.pl i pobieranie znów nie działa...</title><link>http://b.nano2.pl/2010/07/18/wrzuta-pl-i-pobieranie-znow-nie-dziala/</link><description>

Programiści z wrzuty po raz kolejny zmienili sposób pobierania danych ich playera z serwerów. Rezultat jest dosyć oczywisty, większość programów oraz serwisów żerujących na wrzucie przestało działać. Jako, że wizja niemożności słuchania Beethovena w przeglądarce bez Flasha była wręcz przerażająca - postanowiłem przyjrzeć się co się zmieniło.

 Dawniej wystarczyło skopiować tzw. hash z adresu naszego utworu Beethovena po czym przepisać adres w przeglądarce na kształt:

http://[1].wrzuta.pl/aud/file/[2]/[3]

1 - nick osoby która wgrała plik
2 - hash pliku
3 - nazwa utworu (chyba nawet nie potrzebna)

Zostało to później zmienione - tzn. zmiany nazw katalogów, ale zasada była taka sama. Dzisiaj aby dostać się do pliku wymagany jest nie tylko hash (i to nie ten który widnieje w adresie przeglądarki!), ale również czas wywołania żądania oraz pewna suma kontrolna - która jest generowana względem czasu żądania.

http://c.wrzuta.pl/[1]/[2]?SDSAccessKeyId=[3]&amp;Signature=[4]&amp;Expires=[5]

1 i 2 - hash najprawdopodobniej zależny od nazwy utworu/uploadera
3 - wewnątrz serwerowy hash pliku
4 - suma kontrolna
5 - czas żądania typu POSIX

Taki link jest generowany tylko raz, i domyślam się, że staje się nieaktywny po pewnym czasie. Wniosek jest jeden: za każdym razem gdy chcemy odtworzyć utwór Beethovena potrzebny jest nam nowy link.

Jak się okazuje to nie Flashowy player buduje powyższy link do pliku tylko serwer wrzuty. Czyli zanim odtworzymy cokolwiek na wrzucie, najpierw player łączy się z serwerem po czym dostaje owy wygenerowany link i dopiero pobiera interesujący nas plik. Jak otrzymuje owy link?

http://[1].wrzuta.pl/xml/plik/[2]

1 - nazwa użytkownika
2 - hash pliku (ten z adresu)

W odpowiedzi otrzymujemy dokument XML, gdzie w drzewie dokumentu znajdujemy tag fileId z naszym nowym wygenerowanym adresem. Tadam!

Mądra myśl!

Jeżeli myślisz, że zmiana jest bezsensowna bo dalej można dowolnie pobierać pliki to jesteś bliski prawdy. Tym to sposobem Wrzuta.pl zablokowała dostęp do tworzenia pobieranych linków wszystkim serwisom Internetowym generującym owe linki za pomocą JavaScriptu (z poziomu JS nie można pobierać żadnych danych nie ze swojej domeny).

Natomiast serwisy które ten zabieg zrobią po stronie serwera, wrzuta może z czasem zablokować dostęp do serwera po IP - w końcu adres IP serwera jest stały. Zostaną tylko sprawne aplikacje po stronie klienta i własne wklepywanie adresu w przeglądarkę...</description><pubDate>Sun, 18 Jul 2010 22:13:54 +0200</pubDate><guid>http://b.nano2.pl/2010/07/18/wrzuta-pl-i-pobieranie-znow-nie-dziala/</guid><category>Offtopic</category><category>Techblog</category></item><item><title>Canvas i płonący input</title><link>http://b.nano2.pl/2010/07/16/canvas-i-plonacy-input/</link><description>

W ramach przygotowań do nowego wyglądu dla tego bloga, postanowiłem pobawić się trochę nowym wynalazkiem HTML5 - obiektem canvas, którego planuje wykorzystać w nowym designie. Wynik okazał się dosyć nietypowy... [:

Co powiecie na małe podpalenie przycisku po najechaniu na niego myszką? Może taki efekt przydałby się dla przycisku &quot;kup teraz&quot; w serwisie Allegro.pl? Oddam skrypt dla tego celu nawet bez dziękuje...

A już bardziej poważnie, przy szorowaniu myszką po kilku buttonach naraz przeglądarka może srogo spowolnić. Z moich obserwacji efekt najwydajniej działa w Operze oraz Google Chrome. Ale najładniej się prezentuje w Firefoxie i Operze. W przypadku windosowskiego Safari podświetlenie tylko jednego buttona zacina na kilka sekund przeglądarkę.

	Z całą pewnością to nie wina cztero-rdzeniowego pheneona 3,2 Ghz.
Na leciwym laptopie w przeglądarce Google Chrome animacja chodzi o dziwo płynnie.


Aby zaobserwować efekt należy posiadać przeglądarkę z obsługą canvas. Czyli na dziś wszystkie IE'ki odpadają. Omawiany efekt można zobaczyć tutaj...</description><pubDate>Fri, 16 Jul 2010 20:59:19 +0200</pubDate><guid>http://b.nano2.pl/2010/07/16/canvas-i-plonacy-input/</guid><category>Idea</category><category>Programowanie</category><category>Techblog</category></item><item><title>Kod z numeracją wierszy na Twojej stronie</title><link>http://b.nano2.pl/2010/07/12/kod-z-numeracja-wierszy-na-twojej-stronie/</link><description>Stare problemy powracają jak nowe. Już jakiś czas temu na jednym z kanałów IRCa miałem okazję uczestniczyć w dyskusji pt. jak umieścić kod na stronie Internetowej z numeracją wierszy, tak aby przy kopiowaniu tekstu uzyskać sam skopiowany tekst. Jeżeli po przeczytaniu tego zdania nie wiesz w czym problem, już wyjaśniam.

Otóż umieszczając kod na swojej stronie, możemy zrobić to na kilka sposobów. Za pomocą tagu  lub stosując listę  z naszym kodem otoczonym tagiem . Jeżeli interesuje nas numerowanie wierszy rodem z profesjonalnego edytora, to niestety  odpada.



    Linia 1
    Linia 2



W ten sposób uzyskujemy numeracje wierszy która jest niezależna od JavaScriptu czy nawet zadziała bez CSSa. Problem natomiast pojawia się przy próbie skopiowania do schowka owego kodu. Zaznacz powyższy kod i skopiuj go do jakiegoś edytora, uzyskasz mniej więcej taki efekt:

1. 
2.     Linia 1
3.     Linia 2
4. 

Tutaj nasuwa się pytanie: po co mi numeracja wierszy skoro chciałem SAM kod? Odpowiedź jest bardzo prosta: przeglądarka po prostu kopiowała treść z listy. Problem jest dosyć dotkliwy gdy kopiujemy w ten sposób dużą ilość kodu, usuwanie w każdym wierszu numeru wiersza jest dosyć nieprzyjemną sprawą.

Dlatego przyjęło się rozwiązywać ten problem na kilka sposobów: 

	Obok naszego ślicznego kodu umieszcza się przycisk konwertujący za pomocą JavaScriptu kod wewnątrz listy do tagu/pola które nie powoduje tego efektu (jak.  czy ). Jednocześnie tracimy numerację wierszy, ale kod możemy skopiować jak trzeba.
	Obok kodu umieszcza się przycisk który po kliknięciu otwiera nowe okno z czystym tekstem. Taki mechanizm znajdziemy np. w syntaxhighlighter.
	Można się spotkać także z tworzeniem numeracji niezależnie. Czyli mamy z lewej w jednym tagu same numerki, z prawej kod umieszczony w . Albo nam się numerki wiersza będą nie zgadzać gdy przez przypadek zapomnimy o blokadzie łamania wierszy (white-space) albo na kilka sekund nasza przeglądarka będzie generować owe cyferki gdy postanowimy ten zabieg wykonać po stronie klienta. Nic już nie będę wspominał o wyglądzie strony bez CSS. Takie rozwiązanie stosuje np. wklej.org.


Istnieje jeszcze jedno rozwiązanie pozbawione powyższej wady którego niestety nie miałem okazji spotkać w Sieci. Mam na myśli właściwości counter-* które dostępne są już od CSS 2.1!

Co to takiego? Otóż CSS 2.1 pozwala wstawić za pomocą właściwości content:; nie tylko sztywny - wcześniej ustalony tekst. Ale oferuje również kilka ciekawych funkcji, między innymi: counter(nazwa_sekcji). Który wstawia w określony tag wartość, wcześniej zdefiniowanego licznika. Jeżeli połączymy tą właściwość z pseudoklasą :before możemy utworzyć przed każdym tagiem w sekcji, numer który rośnie w górę - w naszym przypadku jest to jednoznaczne z numerem wiersza.

	Ze względu na to, że :before jest niewidzialne przez DOM, przeglądarka kopiując treść pomija wszystkie treści wstawione za pomocą tego elementu. Dlatego kopiując kod gdzie obok znajdują się cyfry, w systemowym schowku znajdziemy treść bez nich.


Nasz kod umieszczamy na stronie w ten sposób ( i  chyba najbardziej pasują pod względem semantyki do omawianego rozwiązania):


Linia 1
Linia 2


Natomiast w CSS'ie strony musi się znaleźć ten kod:

pre {
	counter-reset:section 0;
}
pre span:before {
	counter-increment:section;
	content:counter(section);
}

Wystarczy, że wg. własnych kryteriów odpowiednio ostylizujemy nasz nowy codebox, a w rezultacie otrzymamy numerację wierszy, kod który po zaznaczeniu i skopiowaniu nie zawiera jakichkolwiek śmieci, a na dodatek przejrzysty i zgodny ze standardami kod dokumentu.

Powyższe rozwiązanie rzecz jasna nie działa w IE 6&amp;7, ale na szczęście już IE 8 obsługuje kod poprawnie.

Powyższy kod w akcji możecie zobaczyć w tej małej prezentacji.</description><pubDate>Mon, 12 Jul 2010 17:09:05 +0200</pubDate><guid>http://b.nano2.pl/2010/07/12/kod-z-numeracja-wierszy-na-twojej-stronie/</guid><category>Idea</category><category>Programowanie</category><category>Techblog</category><category>code html5 css3</category></item><item><title>Finser.pl -  uruchomiony</title><link>http://b.nano2.pl/2010/07/03/finser-pl-uruchomiony/</link><description>

Kolejna zakończona realizacja moja... dla mnie. Finser jest webaplikacją służącą do zarządzania pieniędzmi, analizy wydatków czy kontroli przychodów. Wszystko oparte na pomyśle - jednym z głównych atutów, blipa czy twittera: składni. Dane do Finsera wprowadza się za pomocą zwykłego tekstu wzbogaconego o takie elementy jak tagi, konta czy po prostu kwotę.

Wpisujesz -20zł na #kino, dusisz enter i to wszystko! Finser będzie zliczał na bieżąco ile wydałeś na #kino, ile masz jeszcze pieniędzy w $portfel'u - a to dopiero początek! Analiza miesięczna, roczna, statystyki i wykresy to niewątpliwie cenne dane podczas kolejnych wydatków.

Przykłady jak używać Finsera oraz niektóre jego funkcje można zobaczyć w prezentacji instruktażowej.</description><pubDate>Sat, 03 Jul 2010 10:59:23 +0200</pubDate><guid>http://b.nano2.pl/2010/07/03/finser-pl-uruchomiony/</guid><category>Idea</category><category>Projekty</category></item><item><title>Szybciej niż DOMContentLoaded</title><link>http://b.nano2.pl/2010/07/02/szybciej-niz-onload-dom/</link><description>Oddzielenie warstwy zawartości, prezentacji i zachowania w dzisiejszych czasach stało się już nie trendem, a jednym z podstawowych umiejętności koderów. Takie rozwiązanie ma wiele zalet - daruje sobie i Wam ich wyszczególnianie. Są oczywiście również wady. Jedną z bolączek tego rozwiązania jest problem skakania strony podczas ładowania dłuższych dokumentów. Związane jest to z faktem, że zanim DOM dokumentu zostanie załadowane wszystkie bloki które zostaną ukryte za pomocą JavaScriptu na chwilę pojawią się na ekranie po czym znikną (np. w przypadku kart zakładek).


	Oczywiście jeżeli koder stwierdzi: czemu by nie ukryć za pomocą stylów wszystkich kart zakładek z wyjątkiem tej wybranej - bo przecież JavaScriptem można zmieniać zakładki, to rzecz jasna problemu nie będzie...
	Ale jeżeli chcemy być przyjaźni dla osób bez JavaScriptu oraz QL&amp;Trendy to problem jest.


Riddle kiedyś na swoim blogu wspominał, że w tylko w takich przypadkach wrzucanie skryptów gdzieś w bebechy  jest usprawiedliwione. To jedyne wyjście?

Ostatnio wpadłem na pomysł jak można by w niektórych przypadkach ten problem rozwiązać. Wystarczy, że za pomocą JavaScriptu umieszczonego w sekcji  dokumentu dorzucimy do tagu  klasę js. Możemy to zrobić nawet jeżeli jeszcze nie został dodany ani jeden element  do DOM. Odtąd tworząc style stosujemy prefiks .js ustalając zachowanie elementów z włączonym JavaScriptem. W efekcie otrzymujemy CSS dla użytkowników z JavaScriptem i bez.

Metoda działa we wszystkich nowoczesnych przeglądarkach jak i również w IE 6.0 i wyższych.

{geshi lang=javascript} 
document.getElementsByTagName('html')[0].className = &quot;js&quot;; 
{/geshi}

{geshi lang=css}.tab {display:block;}

.js .tab {display:none;}
.js .tab.select {display:block;}{/geshi}

Dzięki temu rozwiązaniu, również możemy np. w prosty sposób ukryć na stronie elementy które są dostępne tylko z JavaScriptem. Zastosowań jest wiele...

{geshi lang=css}#twitter {display:none;}
.js #twitter {display:block;}{/geshi}

Przygotowałem dwie prezentację, pierwsza to bardzo prosta pokazówka jak działa powyższy kod, druga zaś to przykład kart z zakładkami (nie zapomnieć zobaczyć karty bez JavaScriptu!).

Edit: kilka poprawek.</description><pubDate>Fri, 02 Jul 2010 15:52:58 +0200</pubDate><guid>http://b.nano2.pl/2010/07/02/szybciej-niz-onload-dom/</guid><category>Idea</category><category>Programowanie</category><category>Techblog</category></item><item><title>Generowanie wykresów Flash za pomocą JavaScriptu</title><link>http://b.nano2.pl/2010/03/11/generowanie-wykresow-flash-za-pomoca-javascriptu/</link><description>

Generowanie wykresów na stronach Internetowych jest problemem który możemy rozwiązać na kilka sposobów. Od rozwiązań po stronie serwera - czyli generowanie obrazków z wykresem przez nasz skrypt, po rozwiązania po stronie klienta. Albo stosujemy jakieś zewnętrzne narzędzia - np. Google API, albo próbujemy sami. Możemy to zrobić np. wyginając niesemantycznie kilka warstw (lub ładniej obiektem , ale niestety nie zawsze wspieranym) lub podać dłoń technologii Flash - której się przyjrzę.

Poszukując dla swojego projektu rozwiązania, głównym kryterium był wymóg prostej interakcji z użytkownikiem. Mam na myśli, wyświetlenie bardziej precyzyjnych danych pozycji wykresu po najechaniu na nią myszką. Dlatego generowania obrazkowych wykresów kategorycznie się nie nadawało. Wybór technologii Flash spowodowany był tylko jednym argumentem - większa dostępność w stosunku do młodego obiektu canvas.


	Tak trochę odbiegając, generowanie po stronie klienta wykresów ma spory plus, oszczędza moc naszego serwera...


Open Flash Chart 1.9.7

Jako, że z technologią Flash miałem dawno krótką przygodę postanowiłem poszukać jakiegoś gotowego rozwiązania. Odnalazłem projekt o nazwie Open Flash Chart który został opublikowany na bazie licencji GPL. Projekt aktualnie jest rozwijany w wersji 2.x - która dla mojego dosyć purystycznego oka, posiada dosyć sporą wadę: plik Flash waży ponad 250KB. Na szczęście w serwisie SourceForge odnalazłem, ostatnią wersję projektu z linii 1.x w której plik Flash nie przekracza 65KB a zarazem spełnia wszystkie moje oczekiwania.

Wersja z linii 1.x niestety dopuszcza tylko dwa sposoby wprowadzenia danych do wykresu - i nie ma możliwości zrobienia tego za pomocą JavaScriptu (co ciekawe w linii 2.x zostało to wprowadzone, ale było by za łatwo). Pierwszy to przez podanie parametru ze ścieżką z danymi do wykresu wraz ze ścieżką do pliku Flash, np.:


	</description><pubDate>Thu, 11 Mar 2010 14:15:45 +0100</pubDate><guid>http://b.nano2.pl/2010/03/11/generowanie-wykresow-flash-za-pomoca-javascriptu/</guid><category>Programowanie</category><category>Projekty</category><category>Techblog</category></item><item><title>Nano² Studio uruchomione</title><link>http://b.nano2.pl/2010/02/12/nano-studio-uruchomione/</link><description>

W końcu! Wielotygodniowy produkt mych dłoni w końcu mogę odhaczyć na liście pt. &quot;do zrobienia&quot;...

A tymczasem aż wypada się pochwalić. Zapraszam: nano2.pl . :)</description><pubDate>Fri, 12 Feb 2010 12:54:14 +0100</pubDate><guid>http://b.nano2.pl/2010/02/12/nano-studio-uruchomione/</guid><category>Programowanie</category><category>Projekty</category></item><item><title>Wykrywanie Adblocka</title><link>http://b.nano2.pl/2009/05/31/wykrywanie-adblocka/</link><description>Sam autor najpopularniejszego dodatku XXI wieku - Adblocka, stwierdził, że jego projekt przyczynił się do zrujnowania reklamy w sieci. W efekcie, prowadzenie serwisów opartych głównie o zyski z reklamy dla ich właścicieli stało się nie opłacalne, i/lub w konsekwencji doprowadziło do stosowania nieracjonalnych praktyk przez administratorów.

Skomplikowane próby ominięcia blokad, blokowanie całej strony dla przeglądarki Firefox czy najbardziej przyziemnie: ban w obrębie serwisu za wspomnienie o fakcie posiadanego dodatku, to kilka znanych mi interwencji Anty-Adblockowych.

Adblock meta-tag
A przecież można inaczej. Władimir Palant - twórca dodatku, choć jako koncepcje, przedstawił pomysł aby na każdej stronie posiadającej specjalny meta-tag, przeglądarka pytała użytkownika czy dla dobra serwisu nie chce zrezygnować z blokowania reklam.

Poniżej, ów meta-tag. Aktualnie to tylko propozycja:






Rozwiązanie co prawda jest trochę kontrowersyjne, ale chyba przedstawia najlepsze z możliwych rozwiązań: dobrowolną zgodę użytkownika sieci na oglądanie reklam. Tylko w moim odczuciu, choć idea jest szczytna to realizacja już nie.

Tak jak dziś automatyczne szukamy iksa widząc niechcianego pop-upa, to w przypadku przemierzanych setek serwisów dziennie, ciągłe zastanawianie się nad tym czy temu portalowi pozwolić zarobić, czy też nie, zaowocuje niechęcią do jakiegokolwiek kompromisu.

Dlatego właściciele serwisów w tej kwestii, powinni się skupić raczej na stałych użytkownikach niż na chwilowych bywalcach. Co mam na myśli? Linia nad każdą reklamą zatytułowana &quot;ten serwis zarabia z reklam, dziękujemy&quot; oddziaływuje na decyzję gościa w lepszy sposób niż wizja bana za wspomnienie o posiadanym dodatku.

Wzorcowy przykład można znaleźć w serwisie Valhalla.pl. Oczywiście ujrzymy go z wyłączonym Adblockiem.


Możemy również skorzystać z możliwości jakie daje nam JavaScript. Mianowicie, chociaż Adblock reklamę zablokuję to dlaczego w jej miejsce nie wstawić bloku z prośbą o dodanie serwisu do zielonej listy? A może do momentu implementacji, wyżej omawianej funkcjonalności warto za-symulować pasek pytający o chęć odblokowania reklam?

 Może lepiej grzecznie poprosić?

Adblock detect
Na początku, musimy się dowiedzieć czy użytkownik posiada włączonego Adblocka. Są na to - przynajmniej znane mi, dwa sposoby (opierają się o JavaScript).

Działają tylko w Firefoxie, z racji tego, że AdBlock jest tylko na... Firefoxa.


Metoda I
Pierwszy sposób jest banalnie prosty, tworzymy plik JavaScript na serwerze o nazwie która jest blokowana przez Adblocka (wystarczy poszukać w liście filtrów), dla przykładu to np: googleads-*, adrot.js czy webads.js, oraz następnie wczytać go tagiem . Teraz drugim skryptem sprawdzamy czy umieszczona zmienna w tym skrypto-pliku została załadowana, jeżeli nie to najwidoczniej przeglądarka posiada włączonego Adblocka.

Nazwę trzeba dobrać ostrożnie. Każda subskrybucja ma inne filtry, więc musimy znaleźć taką wszech-występującą.
Nie trudno się domyślić, że ta metoda posiada kilka wad. Wystarczy, że dobierzemy nie właściwą nazwę, bądź ktoś przez przypadek usunie ów plik a rezultat będzie błędny.
No i jeszcze niepotrzebnie zwiększamy ilość wywołań do serwera.


Przykładowo zawartość pliku googleads-foo.js:

// googleads-foo.js
var adblock = true;


I nasz dokument:




  if(typeof(adblock) == &quot;undefined&quot;) {
    document.write(&quot;You use Adblock!&quot;);
  }




Na podobnej zasadzie funkcjonuje metoda przedstawiona na adblock.org, z tą różnicą, że tam jest pobierany obrazek graficzny o zakazanej nazwie.

Powyższą metodę, można zobaczyć w akcji tutaj.

Metoda II
Druga metoda działa w analogiczny sposób, jak powyżej lecz zamiast pobierać jakikolwiek plik, tworzy w dokumencie kilka warstw o określonej nazwie klasy. Jeżeli Adblock taką warstwe zablokuje, zablokowany obiekt otrzymuje styl -moz-binding, dzięki czemu możemy wykryć ingerencję dodatku.

Dla pewności sprawdzamy kilka nazw.
Dlatego prawdopodobieństwo, że wynik będzie nieprawidłowy jest znacznie mniejsze od metody I.





  var adblock = false;
  var test = [&quot;articleAd&quot;,&quot;googlead&quot;,&quot;adsense&quot;];
  var object = [], s = null;
 
  for(var i in test) {
    document.write(&quot;Testing...&quot;);
    object[i] = document.getElementsByClassName(test[i]);
 
    if(object[i].length &gt; 0) {
      object[i] = object[i][0];
      s = document.defaultView;
      s = s.getComputedStyle(object[i],null);
      s = s.getPropertyValue(&quot;-moz-binding&quot;);
 
      if(s != &quot;none&quot;) {
        adblock = true;
        break;
      }
    }
  }
 
  if(adblock) {
    document.write(&quot;You use Adblock!&quot;);
  }




Tutaj można zobaczyć jak wygląda powyższy kod na żywo.

Adblock Ask 0.0.1
 Nie najlepsza, ale najprostsza forma skuszenia użytkownika do wyłączenia Adblocka.

Odtąd, możemy na wszelkie sposoby wpływać na użytkownika. Oczywiście, wszystko w granicy dobrego smaku. Dla przykładu, zaimplementowałem pasek informacyjny podobny do Idei Władimira Palanta (w Polsce Jego nazwisko nie brzmi zbyt okazale). Raz na sesję będzie monitował prośbę o wyłączenie Adblocka.

Jeżeli chcesz go użyć na swojej stronie, pamiętaj zmienić nazwę pliku. Gdyż pewnie niedługo adblockask.js trafi na listę filtrów Adblocka.


Zobaczyć można go tutaj , a pobrać stąd.</description><pubDate>Sun, 31 May 2009 21:56:19 +0200</pubDate><guid>http://b.nano2.pl/2009/05/31/wykrywanie-adblocka/</guid><category>Projekty</category><category>Techblog</category></item><item><title>Pierwsze spojrzenie na Internet Explorer 8</title><link>http://b.nano2.pl/2009/03/19/pierwsze-spojzenie-na-internet-explorer-8/</link><description>

Wraz z porażką jaką okazał się Internet Explorer 7 - z którym, muszę się przyznać, wiązałem spore nadzieję, wiadomość o nadejściu kolejnej edycji uwielbianej przez webdesignerów przeglądarki traktowałem już odpowiednio sceptycznie.

Zapowiadana lepsza obsługa standardów, wydajniejsza praca programu niż u konkurencji (przynajmniej wg. Microsoftu) oraz większe bezpieczeństwo ma skłonić użytkowników do powrotu na stare śmiecie. Stopując tendencje spadkową w rankingach przeglądarek Internetowych.

Faster, Safer meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=EmulateIE7&quot; /&gt;


ACID3
Na dobicie słowa standard w odniesieniu do naszej ósemki przeprowadziłem dwa popularne testy zgodności. Pierwszy to już sławny ACID w wersji 3 - testujący praktycznie każdy element przeglądarki, od obsługi CSS'a po JavaScript. Oraz test numer dwa, sprawdzający obsługę selektorów zawartych w specyfikacji CSS3.

Internet Explorer 8 testowany był w trybie wyłączonej kompatybilności z wersją 7.






A co z wydajnością?
Zapowiadana przez Microsoft większa wydajność ósemki nad konkurencją wydaje się być co-najmniej... naciągana. Nie dlatego, że podczas testów Microsoft użył nie najświeższych wersji przeglądarek konkurencji. Nie dlatego, że nie opublikował on programów którymi te testy były przeprowadzane. Ale za stwierdzenie, że JavaScript w tym wyścigu to nie wszystko.

W dobie wszędzie wciskanego jQuery, Prototype i innych frameworków wykonanie prostego kodu opakowanego w najróżniejsze śmiecie wzrasta o mnóstwo niepotrzebnych instrukcji. Mała wydajność wykonywania kodu potrafi zabić komfort korzystania z serwisów opartych o tą technologię. A jak wiadomo, tego typu serwisów jest coraz więcej...

Chodź - pewnie nie tylko ja, byłem świadom rezultatu, ale dla pewności poddałem ósemkę dwóm testom mierzących wydajność JavaScriptu. Chodź wynik był do przewidzenia, zaskoczeniem dla mnie był wzrost wydajności w stosunku do wersji beta aż o trzy razy.

Testy przeprowadziłem na już leciwym laptopie opartym o Windows XP Service Pack 2, z AMD Turionem 1.6Ghz na pokładzie oraz 512MB pamięci RAM.


Pierwszy test to dość popularny SunSpider - używany w praktycznie w każdych zestawieniach przeglądarek.



Na drugi test wybrałem V8 Benchmark który był projektowany pod przeglądarkę Google Chrome (której niestety nie uwzględniłem w zestawieniu - braku czasu).



Na koniec
Po kilku godzinach testów, mogę stwierdzić bez wahania, że najnowsze dziecko z Redmond posiada co-najmniej jedną mocną zaletę. Mianowicie taką, że... nie psuje sieci po raz kolejny (dzięki wyżej wspomnianemu meta tagu). Już nam webdeveloperom wystarczy IE6 i jego siódma odsłona.

Tymczasem więcej na temat ósemki dowiemy się z czasem, kiedy społeczność przyjrzy się temu produktowi odrobinę bliżej...</description><pubDate>Thu, 19 Mar 2009 21:35:36 +0100</pubDate><guid>http://b.nano2.pl/2009/03/19/pierwsze-spojzenie-na-internet-explorer-8/</guid><category>Offtopic</category><category>Techblog</category><category>internet explorer 8</category></item><item><title>Pierwsze miejsce w konkursie Jogger.pl</title><link>http://b.nano2.pl/2009/03/09/pierwsze-miejsce-w-konkursie-jogger-pl/</link><description>Z dość sporym opóźnieniem (jakieś osiem dni) w końcu należy się pochwalić. Szablon mojego autorstwa - Simple, którego miałem okazję zaprezentować dzień przed zdaniem prac na konkurs o domyślny szablon Joggera zdobył w głosowaniu pierwsze miejsce.

Wszystkim głosującym serdecznie dziękuje za oddane głosy na mój projekt.</description><pubDate>Mon, 09 Mar 2009 21:15:29 +0100</pubDate><guid>http://b.nano2.pl/2009/03/09/pierwsze-miejsce-w-konkursie-jogger-pl/</guid><category>Projekty</category></item><item><title>Zdań siedem o Windows Seven</title><link>http://b.nano2.pl/2008/12/29/zdan-siedem-o-windows-seven/</link><description>Postanowiłem popłynąć, i dać się wciągnąć w nurt Internetowego BOOM na temat ewolucji kochanego Windowsa, dziś Seven. I tak...

...po przejrzeniu setek screenów, kilkunastu mniej-lub więcej udanych relacji na gorąco, kilkuset zdatnych do czytania komentarzy oraz kilku opinii znających-się-na-tym fachowców doszedłem do przerażających wniosków.

Tak, zgadza się; nie widziałem Windows Seven na żywo.


 Niach! Niach!

(3) Znowuż dostajemy system operacyjny którego nie chcieliśmy - począwszy od wtłoczonego w niego asortymentu rodem z hal Supersamu, po silnik napędzający ten wielki stragan z napisem &quot;postukaliśmy młoteczkiem, jest lepiej&quot;.

Dlaczego dalej system zajmuje 500MB pamięci RAM?
Blokada systemu dla komputerów z mniejszą ilością pamięci niż 512MB?
Gdzie MinWin? Gdzie WinFS? Gdzie moja kawa?


(4) Jednakże najbardziej bolącą mnie kwestią jest interfejs systemu. (5) Nie boli mnie to, że znowuż zerznięto kilka koncepcji od konkurencji, nie boli mnie świecący jak psu j*** interfejs, nie bolą mnie wstążki czy inne kwiaciarskie akcesoria...

(6) Boli mnie to co narzucono każdemu, począwszy od profesjonalnych firm po domorosłych programistów czy dizajnerów, czyli styl swoich produktów (każdy produkt, która zechce zaistnieć w świecie Windows Seven swój wygląd będzie musiał dostosować do dizajnu systemu - który nie jest już tłem ale elementem całości, a wszelkie odstępstwa będą odbierane jako brak smaku).

Wrzućcie kosz z wikliny do nowoczesnego klubu... dajmy to... techno.


(7) Na co teraz wzdycha publika, &quot;ochając, achając&quot; zewsząd już za niedługo stanie się kiepskim natarczywym standardem na którego reakcje będą zgoła przeciwne - mające swoją podstawę w skurczach mięśni brzucha i przepony, a odwrót... niestety będzie bolesny.

Na potwierdzenie swojej tezy... Idylla.
To to z tymi skurczami nie traktować dosłownie... (:
</description><pubDate>Mon, 29 Dec 2008 19:37:21 +0100</pubDate><guid>http://b.nano2.pl/2008/12/29/zdan-siedem-o-windows-seven/</guid><category>Myśli kudłate</category></item><item><title>Jak zatrzymać przekierowanie meta...</title><link>http://b.nano2.pl/2008/08/23/jak-zatrzymac-przekierowanie-meta/</link><description>Uniwersalnych sposobów na przekierowanie klienta z jednej podstrony na drugą jest wiele, możemy to zrobić z poziomu protokołu HTTP - parametrem Location. Lecz dla niektórych przeglądarek, antywirusów czy routerów ten parametr jest nie mile widziany. Dlatego też, może stać się tak, że w procesie pobierania dokumentu może on gdzieś... zniknąć.

I przekierowania nie ma...


Kolejnym sposobem, jest tag  umieszczany w sekcji  dokumentu. Skuteczność takiego rozwiązania, jest prawie stuprocentowa. Najwyżej któryś z klientów - na własne życzenie, zostanie zapytany czy na pewno, ma dojść do przekierowania.

&quot;Własne życzenie&quot;, ustawia się w polityce bezpieczeństwa browsera...


Ostatnim sposobem - o którym tutaj wspomnę, jest JavaScript - za pomocą obiektu location, oraz pola href natychmiast możemy zmienić interesujący nas dokument. Ale aby zbyt pięknie nie było, w tym przypadku dotyka nas jak-świat-stary-problem. Co wtedy gdy, klient wyłączy JavaScript? Dokładnie, nic.

How to stop javascript refresh?
Dlatego dla największej dostępności, w profesjonalnych projektach sposób numer dwa wydaje się być najlepszym rozwiązaniem. Tylko tutaj nasuwa się pytanie; jak zatrzymać przekierowanie w momencie gdy się &quot;rozmyślimy&quot;?

Dla przykładu; klient w dokumencie klika na dynamiczny - zasilany JavaScriptem, panel i zaczyna wypełniać formularz. Wypada zresetować mu zawartość formularza oraz postawić go przed innym dokumentem?


Tak jak dla pierwszego sposobu nie ma żadnej opcji &quot;odwrotu&quot;, tak dla trzeciego jest - i to całkiem prosty.



  



How to stop meta refresh?
A jak zatrzymać przekierowanie ? Tutaj sprawa się komplikuje. Mozilla Firefox oraz Safari zadowalają się wywołaniem window.stop() zaraz po wczytaniu dokumentu. Bez względu na to czy odliczanie się już skończyło, czy też nie.

Dlaczego po wczytaniu? W przypadku przekierowania tagiem , każda przeglądarka inicjuje odliczanie dopiero po wczytaniu całego dokumentu.







window.addEventListener(&quot;load&quot;,function() {
  window.stop();
},false);


Natomiast Opera oraz Internet Explorer, wywołanie window.stop() oczekują dokładnie w momencie wywołania procedury wczytania nowej strony (czyli w momencie przekierowania).

No może nie Internet Explorer, bo... nie obsługuje window.stop(). Naszczęście jest document.execCommand(&quot;Stop&quot;);.


Na wszelki wypadek - bo nie wiemy nigdy jak długo przeglądarka będzie inicjować wczytanie nowej strony, funkcje stopującą można wywołać kilka razy w odstępie kilku milisekund.


var _time = document.getElementById(&quot;_refresh&quot;);
_time = _time.getAttribute(&quot;content&quot;).toInt();
 
window.onload = function() {
  window.setTimeout(function() {
    var count = 0;
    var interval = window.setInterval(function() {
      if(count++ &gt; 100)
        window.clearInterval(interval);
      if(_browser.ie)
        window.document.execCommand(&quot;Stop&quot;);
      else
        window.stop();
    },5);
  },_time*1000);
};


Samodzielny kod w akcji, można zobaczyć tutaj.</description><pubDate>Sat, 23 Aug 2008 16:57:49 +0200</pubDate><guid>http://b.nano2.pl/2008/08/23/jak-zatrzymac-przekierowanie-meta/</guid><category>Techblog</category></item><item><title>New design: Foible</title><link>http://b.nano2.pl/2008/08/14/new-design-foible/</link><description>Gdy opublikowałem swój pierwszy wpis na tym to blogu, zaraz to w trzecim komentarzu przyobiecałem sobie, że strona graficzna ów strony zostanie zastąpiona autorskim projektem. I tak po dziesięciu miesiącach moje słowo się spełniło.

Dziesięć miesięcy brzmi groźnie...


Wszystko zaczęło się od projektu graficznego, którego zaraz to po pierwszych kreskach pozwoliłem sobie nazwać Foible. Jeżeli moja wiedza z zakresu j. angielskiego jest poprawna, słowo to oznacza słabość. I chyba bardzo celnie określa &quot;korzenie&quot; tego szablonu.

 Stara zasada Joggerowa; jeżeli nie masz o czym pisać zmień design?

Foible
Ów słabość dotyczy serwisu Valhalla.pl. A dokładniej, szaty graficznej. Wcześniej zaznajomieni z ów portalem, dostrzegą w moim projekcie dosyć sporą dozę inspiracji. Czego nie próbuje ukryć.

Ocena efektu końcowego, chyba nie należy do mnie.
Jak wspomniałem na stronie projektu w serwisie digart.pl, na swoje usprawiedliwienie mam jeden znaczący fakt; każdy wykonany element jest autorstwa mojego.


W kwestii samego projektu graficznego, raczej więcej dodawać nie trzeba. Pozostaje jeszcze kwestia wdrożenia szablonu.

Wdrożenie
Szablon został pocięty do  XHTML 1.0 Strict - czyli standard. Oddzielenie struktury dokumentu, od warstwy prezentacji - także standard.  Jedynym rozwiązaniem nietypowym które postanowiłem zastosować, są komentarze. A mianowicie ich stronicowanie w dłuższych wpisach.

Wystarczy aby długość treści wpisu przekraczała 1000 pikseli, aby komentarze znikły pod wpisem, a pojawiły się tuż obok - w bloku po prawej. Gdy ich ilość nie mieści się na całej długości dokumentu, skrypt umożliwi ich stronicowanie. Dla zobrazowania, wystarczy zajrzeć do tego wpisu.

Parametry algorytmu stronicowania wymagają jeszcze małej kalibracji.
Algorytm działa po stronie przeglądarki, tak też wymaga włączonego Javascriptu.


Teraz nie pozostaje mi nic innego, jak... zwiększyć swoją aktywność na tym to blogu. Może tym razem się uda...</description><pubDate>Thu, 14 Aug 2008 14:24:55 +0200</pubDate><guid>http://b.nano2.pl/2008/08/14/new-design-foible/</guid><category>Blog</category><category>Projekty</category></item><item><title>Google Maps w komercyjnym zastosowaniu...</title><link>http://b.nano2.pl/2008/07/09/google-maps-w-komercyjnym-zastosowaniu/</link><description>Zostałem przydzielony do wykonania broszurki reklamowej dla małej prywatnej firmy. Broszurki na której oprócz nazwy firmy, wypunktowanej oferty oraz adresu znaleźć się miała mapa z zaznaczonym punktem gdzie-to-jest. Jak nauczyła historia – na szczęście nie na mojej skórze, użycie do tego celu polskich map (z naciskiem na polskie aplikacje) nie było najlepszym wyjściem.  Dlatego też, postanowiłem skorzystać z usług Google Maps.

Właściciel owej prywatnej firmy jest moim krewnym. Ale to chyba nie ma nic do rzeczy?
Sam projekt graficzny mam nadzieje, że także nie ma nic do rzeczy?



Przyznać się muszę, że najpierw sporządziłem projekt graficzny z użyciem map Google a później dopiero zacząłem studiować tzw. warunki korzystania. Które wnet bezapelacyjnie, rozwiązują kwestie komercyjnego użytku:

Mapy Google, w tym wyniki lokalnego wyszukiwania, mapy i zdjęcia, są udostępniane użytkownikowi tylko do osobistego, niekomercyjnego użytku. Mapy Google są udostępniane użytkownikowi biznesowemu wyłącznie do użytku wewnętrznego i nie mogą być redystrybuowane w celach komercyjnych.

Request for permission
A pod jakim kątem nie spojrzeć, broszurki są wytworem komercyjnym - i nie miały służyć jedynie użytkowi wewnętrznemu. Plan rozpowszechniania broszurek, był prosty: każdy potencjalny klient odwiedzający firmę mógłby otrzymać je za darmo. Ostatnim ratunkiem, przed ręcznym odrysowywaniem dość sporego terenu, był  formularz wniosków o pozwolenie (w j. Ang).

Kiedy potrzebne jest pozwolenie na wykorzystanie Cech marki Google?
Krótka odpowiedź brzmi: prawie zawsze. [...]

Po dokładnym wypełnieniu, formularza oraz dołączeniu do niego zdjęcia broszurki, zgodnie z komunikatem potwierdzającym, odpowiedź miała przyjść w terminie dwóch-czterech tygodni. Przyszła po... sześciu godzinach. Z radosną nowiną: pozwolenie jest (z naciskiem na; tylko ten projekt oraz użycie nie pociągające za sobą zysk) ale z wymogiem dostosowania się do wytycznych dot. korzystania z Cech marki Google.

Wcześniej na użytych mapach Google, był naniesiony tekst &quot;Google Maps ™&quot;. Co zobowiązało do naniesienia poprawek (dodania &quot;© 2008 PPWK, TeleAtlas&quot;).


Wpis ten niech będzie potwierdzeniem, że w Google pracują... ludzie.</description><pubDate>Wed, 09 Jul 2008 12:25:23 +0200</pubDate><guid>http://b.nano2.pl/2008/07/09/google-maps-w-komercyjnym-zastosowaniu/</guid><category>Techblog</category></item><item><title>Każdy ma długopis Joggera, mam i ja!</title><link>http://b.nano2.pl/2008/05/14/kazdy-ma-dlugopis-joggera-mam-i-ja/</link><description>Dwa tygodnie temu gdy D4rky ogłosił konkurs na długopis Joggera postanowiłem zaryzykować i zgłosić się do listy potencjalnych zwycięzców. Poszczęściło mi się. I tak dzisiejszego dnia wróciwszy ze szkoły na biurku obok monitora leżała koperta z fioletową pieczątką &quot;priorytet&quot;.

Bez obaw; listonosz nie wkradł się do mojego pokoju...
...chyba, że to ten &quot;priorytet&quot;. Tylko skąd oni mogli by wiedzieć, że najpierw zaglądam na biurko?



Duszki! Mlask! Mlask!
Oprócz samego długopisu, w kopercie znalazło się... coś jeszcze. Mianowicie w połowie odręcznie zapisana kartka formatu A4, będąca tym czym się dziś rzadko spotyka... tradycyjnym listem (czyżby Michał zechciał cofnąć się do poprzedniego wieku?).

Może nie taki tradycyjny, &quot;wtedy&quot; podpisywano się imieniem i nazwiskiem...


Pozwolę sobie przypuścić, że autor pisał go z nadzieją na publikację jego treści w tym wpisie. Tak też niech będzie...

</description><pubDate>Wed, 14 May 2008 16:55:19 +0200</pubDate><guid>http://b.nano2.pl/2008/05/14/kazdy-ma-dlugopis-joggera-mam-i-ja/</guid><category>Offtopic</category><category>długopis jogger</category></item><item><title>Tyle różu toś na oczy nie widział(a)!</title><link>http://b.nano2.pl/2008/04/28/tyle-rozu-tos-na-oczy-nie-widzial-a/</link><description>Postanowiłem przełamać drętwą formułę (zakładając, że istnieje jakakolwiek formuła) tego bloga i napisać o czymś co raczej nie będzie ani to wartościowe ani to konstruktywne. Więc do sedna...

Pół Internetu jest niewartościowe, a co dopiero konstruktywne... Czym ja się przejmuje?


Po dłuższym czasie (dłuuuższym, nie dłuższym) wykonywania jakiejś czynności (siedzenie przy komputerze jak znalazł!) w końcu się... tak po prostu... odechciewa. Stan apatyczny każą nazywać nam to psycholodzy. Wszystko traci sens, robi się czarno biało (tak to jest metafora) oraz tracimy zainteresowanie czymkolwiek.

Sedno...
Wychodząc z założenia, iż najlepiej leczyć się tym czym się strułeś (lepszego przysłowia nie mam pod ręką) można dojść do wniosku, że ów stan można wyleczyć czymś... bezsensownym.

Brak sensu niwelować bezsensem!


Oto w niecałe dwie godziny (no może trzy) z „zapałem” powstał projekt pt. Ile różu.

Już czuje jak pomaga...

Update: jako, że serwer na którym hostowany był powyższy &quot;projekt&quot; odszedł w niepamięć, to w konsekwencji projektu ujrzeć już nie można. 

I chyba dobrze...
</description><pubDate>Mon, 28 Apr 2008 22:10:25 +0200</pubDate><guid>http://b.nano2.pl/2008/04/28/tyle-rozu-tos-na-oczy-nie-widzial-a/</guid><category>Offtopic</category><category>apatia spam</category></item><item><title>Flush concept – strumieniowy system szablonów, kod roboczy</title><link>http://b.nano2.pl/2008/03/26/flush-concept-strumieniowy-system-szablonow-kod-roboczy/</link><description>Na komfort korzystania z serwisu Internetowego wpływa wiele czynników. Niewątpliwie jednym z podstawowych, jest czas jaki musi odczekać użytkownik po kliknięciu w odnośnik do otrzymania odpowiedzi w formie wygenerowanego dokumentu. W dobie gdy bazy danych – podstawy ówczesnych systemów generowania treści, gromadzą kilkaset megabajtów danych, czas w jakim są odnajdowane oraz zwracane rekordy bezwzględnie rośnie.

Na dodatek systemy CMS wysyłają wygenerowany dokument na samym końcu. Tak też jeżeli widzimy w stopce czas generowania strony, to samo wysyłanie zaczyna się dopiero pod koniec pracy skryptu. Nie dość, że użytkownik musi odczekać czas pracy skryptu to jeszcze czas samego pobierania dokumentu. A dlaczego by nie wysyłać stopniowo dokumentu, wraz z postępami pracy skryptu?


Flush idea


Moim celem było stworzenie systemu szablonów który wraz z dostępem do wartości zmiennych wysyłał by stopniowo generowany dokument. Aby to najprościej uzmysłowić, spójrzmy na poniższy szablon:




  {% $name; %}
  {% $age; %}



System szablonów o mechanice takiej jak Smarty, po uzupełnieniu wartość zmiennej $name (metodą assign()) nic by nie wykonał dopóki nie została użyta metoda display(). W przypadku Flush'a jest inaczej. Po utworzeniu obiektu klasy (w którym w przeciwieństwie do Smarty należy podać ścieżkę do szablonu),


$flush = new flush(&quot;./szablon0.htm&quot;);


skrypt zaczyna natychmiast wczytywać szablon oraz po kawałku wysyłać go klientowi. Tak długo aż napotka tag którego zmienne nie mają wprowadzonej wartości – w przykładzie jest to $name. W tym momencie proces wczytywania szablonu zostaje przerwany (deskryptory nie zostają zamknięte) i „pole do popisu” dostaje kod dalej.


// Jakiś algorytm.
$flush-&gt;assign(&quot;name&quot;,$session-&gt;get_user_name());


Przy każdym dodaniu zmiennej, skrypt sprawdza czy ostatni tag na którym parsowanie zostało przerwane ma już wszystkie zmienne. Jeżeli tak to proces parsowania szablonu zostaje wznowiony. Jeżeli nie to dalej „czekamy”.

Całkowite generowanie dokumentów
Jeżeli ostatecznie nie dostarczymy zmiennych, to nietrudno się domyślić, że szablon nigdy do końca się nie wygeneruje. Nic bardziej mylnego! Metodą display() na końcu skryptu -  jeżeli proces parsowania się jeszcze nie skończył, wygenerujemy resztę szablonu nawet jeśli niektóre tagi nie mają uzupełnionych wartości wszystkich zmiennych (zostaną pominięte bez zatrzymywania).


$flush-&gt;display();


Gdyby uzupełniono w powyższym szablonie wszystkie zmienne, ów metoda okazała by się niepotrzebna (szablon do końca wygenerowała by ostatnia metoda assign()). Chodź jej stosowanie wypadało by traktować, jako poprawność.

Problemy koncepcyjne
Ze względu na sposób generowania szablonu – który pozwoliłem sobie nazwać strumieniowym, Flush posiada kilka problemów o których należy wspomnieć.

Mechanika parsowania szablonu uniemożliwia tzw. &quot;uzupełnianie wstecz&quot;. Tzn. jeżeli parser pominie kilka tagów do określonego fragmentu (kotwice coś takiego umożliwiają – ale zaraz o nich), w późniejszym czasie dodanie wartości do pominiętych tagów, nie spowoduje uzupełnienia ich w już wygenerowanych i wysłanych fragmentach.

Z tego względu uzupełnianie wartości jest procesem bardzo problematycznym - wystarczyło by aby programista zapomniał o uzupełnieniu tagu z początku szablonu, aby cała idea Flush'a poszła na marne. Dokument zaczął by wysyłanie dopiero po metodzie display() która to zapomniany tag by pominęła. Dlatego wpadłem na pomysł... kotwic.

Kotwice
Kotwice pozwalają na skoki do wyznaczonych miejsc, pomijając tagi które nie mają uzupełnionych wszystkich zmiennych (te z uzupełnionymi rzecz jasna zostają wygenerowane). Dla przykładu szablon:




  {% $name; %}
  {% hook(hook0); %}
  {% $age; %}
  {% hook(hook1); %}
  {% $city; %}



A teraz użycie kotwicy:


$flush = new flush(&quot;./szablon1.htm&quot;);
 
if($flush-&gt;hook(„hook0”)) {
 $flush-&gt;assign(„age”,$session-&gt;get_user_age());
}
 
$flush-&gt;display();


Nie ważne, że tag ze zmienną $name nie miał uzupełnionej wartości. Użycie kotwicy – metodą hook(), spowodowało, że nastąpił skok do tagu hook('hook0'); i zwrócenie true na znak sukcesu (znalazłem kotwicę!).

Oczywiście zasada &quot;uzupełniania wstecz&quot; działa także w przypadku kotwic; nie można odwoływać się do kotwic we fragmentach już wygenerowanych i wysłanych. Dla tego parser zapamiętuje jakie już kotwice znalazł, i tak wywołanie metody hook() z nazwą kotwicy która już „przeleciała” zaskutkuje zwróceniem false. Metoda ta zwróci także false jeżeli nie będzie mogła odnaleźć kotwicy – co jest równoznaczne z wygenerowaniem do końca szablonu.


$flush = new flush(&quot;./szablon1.htm&quot;);
 
// Zwroci true.
$flush-&gt;hook(&quot;hook1&quot;);
 
// Zwroci false (za pozno! już kotwica byla!)
$flush-&gt;hook(&quot;hook0&quot;);
 
// Zwroci false i wygeneruje dokument do konca.
$flush-&gt;hook(&quot;hook-no-exist&quot;);
 
$flush-&gt;display();


Kod roboczy
Jako, że projekt jest w fazie koncepcji – i tak naprawdę zadaje sobie pytanie; czy warto go rozwijać, poniżej opublikowany kod roboczy nie powinien być implementowany w żadnym projekcie. Aktualny stan projektu wygląda mniej więcej tak;


Dostępne wszystkie metody oraz tagi z opisanymi dotąd funkcjonalnościami.
Nie przedstawione, a funkcjonalne tagi:

    Instrukcje warunkowe - if(), else, endif (else if nie ma!)
    Includowanie - include()


Nie przedstawione, a funkcjonalne metody:

    Przypisanie kilka zmiennych - assign_array()


Nie przedstawione, a do zaimplementowania tagi:

    Wywołania zwrotne – callback()
    Pętle


Nie ustalona struktura składni

    Zwalnianie wartości użytych zmiennych - !$tag




Flush 0.1 Download 13,4 KB

Wydajność
Jeszcze na sam koniec wspomnę o wydajności w porównaniu ze Smarty (w końcu całe wprowadzenie o tym poświęciłem). Szczerze? Nie wiem. Aktualnie projekt jest na takim etapie, że porównywanie wydajności nie ma sensu. Chodź sam fakt, że generowanie dokumentu przejmuje skrypt nie parser PHP ma ogromne znaczenie. Ale gdyby projekt naprawdę zdobył popularność, czy tak trudno było by go przepisać do C i podpiąć bibliotekę? Nie sądzę.</description><pubDate>Wed, 26 Mar 2008 19:47:37 +0100</pubDate><guid>http://b.nano2.pl/2008/03/26/flush-concept-strumieniowy-system-szablonow-kod-roboczy/</guid><category>Idea</category><category>Projekty</category><category>Techblog</category><category>smarty szablony php flush</category></item><item><title>Flush concept - strumieniowy system szablonów, wprowadzenie</title><link>http://b.nano2.pl/2008/03/21/flush-concept-strumieniowy-system-szablonow-wprowadzenie/</link><description>Nowoczesne Internetowe systemy generowania treści - popularnie CMS, projektuje się na bazie wzorca Model-View-Controller. Pokrótce mówiąc aplikacje dzieli się na trzy główne komponenty; bazę danych, interfejs użytkownika oraz logikę aplikacji. O zaletach takiego rozwiązania nie mam zamiaru tutaj wspominać, bo napisano o tym już wiele.

Smarty engine
Warto natomiast przyjrzeć się metodzie generowania interfejsu poprzez wspomnianą logikę aplikacji. Smarty - projekt developerów zza oceanu, chyba uplasował się w tym miejscu jako synonim – chodź istnieją inne podobne projekty (praktycznie o tej samej mechanice a innej implementacji).

Webdesigner przygotowuje szablon w którym umieszcza specjalne tagi, które dzięki kompilatorowi zostają podmienione na dane przygotowane poprzez logikę aplikacji. Mechanika tego procesu sprowadza się do prostego założenia, tagi zostają podmienione na kod który po załadowaniu przez parser PHP zostanie wykonany. Dla zobrazowania z poniższego fragmentu szablonu, Smarty


{$foo}


zapisze do pliku cache poniższy ciąg, a następnie wczyta i wykona jako skrypt PHP.





Jak nie trudno się domyślić, jeżeli wcześniej uzupełniliśmy tablice _tpl_vars o element &quot;foo&quot; (metodą assign()) jej zawartość tutaj zostanie wydrukowana.

Wady i zalety
Zalet jest sporo. Raz sparsowany szablon nie trzeba ponownie przetwarzać - wystarczy wczytać plik cache i wykonać. Poniekąd mamy zysk wydajności (dlaczego poniekąd to za chwile), bo ostatecznie &quot;wykonuje&quot; szablon parser PHP (binarka, nie skrypt). Ale...

Takie rozwiązanie pociąga za sobą kilka konsekwencji. Wystarczy, aby część algorytmu przed wywołaniem metody display wykonywała się &quot;trochę dłużej&quot;, aby docelowy klient musiał odczekać ów czas do otrzymania pierwszego bajtu generowanego dokumentu.

Trzeba także wspomnieć, o zarządzaniu pamięcią - czyli o czymś czego w ogóle nie ma. Wartości zmiennych (albo wartości elementów tablicy _tpl_vars) są trzymane aż do końca wykonywania skryptu - po czym parser PHP je opróżnia. Ale czy trzymanie kilkaset bajtów przez cały proces kompilacji ma sens, jeżeli będą one użyte tylko raz w szablonie? Zwłaszcza, że serwery obsługują w jednym momencie kilka - nawet do kilkaset, klientów.

W ten sposób spora ilość pamięci jest zarezerwowana bez uzasadnienia. Co skutkuje zmniejszoną jej ilością dla innych procesów, oraz z kolei mniejszą wydajnością (wyżej wspomniane; poniekąd). Tak dla jasności, powyższa teza nie jest potwierdzona żadnymi testami lecz wynika z dedukcji autora.

O pętlach...
Stosowanie systemu szablonów w takiej formie (albo inaczej; mechanice) jak Smarty, pociąga za sobą pewien – nie przez wszystkich, świadomy fakt. Może tym razem najpierw, posłużę się przykładem z popularnego systemu for jakim jest phpBB w wersji 3.0.

Chodź implementacja systemu szablonów jest inna w porównaniu ze Smarty, to mechanika jest taka sama (już o tym wspominałem, wiem). Tak też zamiast $this-&gt;_tpl_vars['foo'] mamy $_postrow_val['foo'], za $smarty-&gt;assign() mamy $template-&gt;assign_var() itd.


// Plik: viewtopic.php, v 1.513
 
// [56-59]
// Skrypt wykonuje zapytanie do bazy danych w celu pobraniu
// postów z określonego topiku. Zwraca handler wyniku zapytania.
$sql = 'SELECT forum_id FROM ' . TOPICS_TABLE
  . &quot;WHERE topic_id = $topic_id&quot;;
$result = $db-&gt;sql_query($sql);
 
// [922-1114]
// Pierwsza obróbka danych. Skrypt przekopiowuje zwrócone
// rekordy do tablicy o określonej strukturze.
while ($row = $db-&gt;sql_fetchrow($result)) {
  $rowset[$row['post_id']] = array(
    'post_id'	=&gt; $row['post_id'],
    'post_time'	=&gt; $row['post_time'],
    'user_id'	=&gt; $row['user_id'],
    'username'	=&gt; $row['username'],
    'post_text'	=&gt; $row['post_text'],
    )
}
 
// [1231-1486]
// Obróbka danych numer dwa. Dodajemy do systemu szablonów 
// tablice 'postrow' z postami.
for ($i = 0, $end = sizeof($post_list); $i &lt; $end; ++$i) {
  $postrow = array(
    'POST_AUTHOR'	=&gt; get_username_string('username',$poster_id,[...]),
    'MESSAGE'	=&gt; $message,
    'POST_ID'	=&gt; $row['post_id'],
  );
 
  // Metoda działa mniej więcej jak funkcja array_push()
  // albo po prostu $template-&gt;vars['postrow'][] = $postrow.
  $template-&gt;assign_block_vars('postrow', $postrow);
}


Po wywołaniu metody odpowiedzialnej za proceder wyświetlenia szablonu, zaczyna się proces kompilacji do kodu PHP (o ile wcześniej tego nie dokonano) oraz wczytanie i wykonanie pliku cache (znów się powtarzam).


// Plik: tpl_prosilver_viewtopic_body.html.php
 
// [98-161]
// Pętla numer trzy, drukowanie na wyjście postów.


  
 



Wniosek jest jeden; aby wydrukować posty skrypt musiał wykonać aż trzy pętle. A co na to użytkownik, który czeka na pierwszy bajt dokumentu?

Aby na siłę nie podciągać argumentów, jestem zobowiązany dodać, że można by było powyższy algorytm przerobić do użycia maksymalnie dwóch pętli. Ale dalej stosowanie systemu szablonów w takiej formie jak Smarty, dodaje skryptowi więcej do przetwarzania – na dodatek tego samego.</description><pubDate>Fri, 21 Mar 2008 16:36:03 +0100</pubDate><guid>http://b.nano2.pl/2008/03/21/flush-concept-strumieniowy-system-szablonow-wprowadzenie/</guid><category>Idea</category><category>Projekty</category><category>Techblog</category><category>smarty szablony php flush</category></item><item><title>Wszyscy zaczynają od... hello world!</title><link>http://b.nano2.pl/2007/11/17/wszyscy-zaczynaja-od-hello-world/</link><description>Więc i ja tak zacznę. Nie dlatego, że nie stać mnie na nic bardziej oryginalnego. Po prostu uważam, że ten oklepany zwyczaj, może już trochę wyświechtany, nadaje się doskonale na tytuł pierwszego wpisu. Tak, pierwszego. Choć podpięty do Internetu jestem już ładne kilka lat, to prócz paru okazyjnych tekstów na blogach &quot;po znajomości&quot; nie miałem okazji prowadzić dziennika na własne konto.
Dlaczego postanowiłem zacząć...
...przygodę z blogowaniem? Otóż, na to pytanie nie ma jednej, prostej odpowiedzi. Z ów zamiarem nosiłem się już kilka miesięcy, lecz każda próba kończyła się niedokończonym projektem CMS'u, kilkunastoma kreskami Designu czy też urwanym zdaniem pierwszego posta na blogspocie. Chociaż podejść było kilka, zawsze próbowałem stworzyć swoje własne miejsce w sieci. Gdzie mógłbym &quot;wylewać&quot; swoje własne przemyślenia czy pomysły. I tak dziś, bez większego planowania - które dla idei stworzenia bloga mogło by być zgubne, postanowiłem stworzyć konto na joggerze. Oraz przyłożyć się na tyle, aby pierwszy wpis w końcu ujrzał światło dzienne. Najgorzej jest zacząć - jak to zdarza się słyszeć.
Kim jestem?
Po powyższym akapicie już pewnie domyślasz się kim jestem. Trochę programistą - z wielkim, szybko uciekającym entuzjazmem, i trochę grafikiem - który nigdy nie kończy swoich prac. Programowaniem zajmuję się - jeżeli można tak to ująć, około pięć lat. Zacząłem klasycznie - od nauki układania tagów w HTML'u. Następnie przyszedł czas poznania arkuszy CSS oraz pierwsze kroki w programowaniu skryptowym - webowy JavaScript. W między czasie &quot;liznąłem&quot; podstawy C, oraz dobrałem się do serwerowego PHP. Na dzień dzisiejszy w największym stopniu programuje w C, chociaż czym będę zajmować się jutro - nie potrafię stwierdzić. Na temat &quot;mnie i grafiki&quot;, warto wspomnieć tylko jeden fakt. Od czasu gdy wpadł mi w ręce Corel Photo-Paint zajmuję się tylko jedną kategorią grafiki - web designem. Z jakim skutkiem? Ocena nie należy do mnie.
O czym mam zamiar pisać?
Oprócz programowania i grafiki, jestem wiecznym emigrantem przechodzącym na Linuksa. Tak, też z tematycznymi wpisami o komputerach - tj. o programowaniu czy grafice, postaram się pisać o moich wrażeniach, problemach czy własnych rozwiązaniach związanych z emigracją na Linuksa. A co poza komputerami? Znam tylko dwa &quot;pewniaki&quot; na to pytanie - atakująca zewsząd polityka, oraz co nieco o naukach ścisłych.
Kończąc swój pierwszy wpis, nie pozostaje mi nic innego jak przytoczyć fragment tytułu. A więc... hello world!
</description><pubDate>Sat, 17 Nov 2007 16:38:21 +0100</pubDate><guid>http://b.nano2.pl/2007/11/17/wszyscy-zaczynaja-od-hello-world/</guid><category>Blog</category></item></channel></rss>