<?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>Tue, 09 Mar 2010 01:25:21 +0100</lastBuildDate><generator>JoggerPL</generator><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.

 Simple wdrożony w tego bloga na czas konkursu...

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>Pen tattoo, rose</title><link>http://b.nano2.pl/2008/09/19/pen-tattoo-rose/</link><description>Wrzesień, czas poszerzania horyzontów, intensywnej nauki oraz skrupulatnej chęci pochłaniania wiedzy. I tak gdzieś w tej gorączce (lekcja j. niemieckiego?), zainspirowany właściwie nie-wiem-czym dokonałem na swej lewej kończynie górnej, w połowie obszaru przedramia, rysunek. Za pomocą dostępnych mi narzędzi - kilku długopisów, stworzyłem coś co po czwartym razie nanoszenia konturów przerosło moje oczekiwania.

Cztery różne długopisy, cztery różne kolory...
Tak dla jasności; to, że przerosło moje oczekiwania to nie znaczy, że przerośnie Twoje...


 Zainspirowany użytkownikami serwisu fotka.pl sesja zdjęciowa... w łazience.

Nigdy nie byłem fanem samookaleczenia. Tak też tatuaże dla mnie sensu nie mają (w ogóle ile można się gapić ciągle na to samo?). Lecz jeżeli chodzi o zdobienie ciała na krótki okres, to od dnia dzisiejszego moje zdanie się zmieniło. Fajnie to wygląda!

Ten akapit, brzmi jakoś tak... niemęsko.


 Scena druga

Chodź me zdolności fotograficzne są marne, a obrazki powyżej małe oraz przepchane filtrami, mam nadzieje, że ktoś odnajdzie w tych podwórkowych bazgrołach odrobinę sztuki...</description><pubDate>Fri, 19 Sep 2008 18:24:34 +0200</pubDate><guid>http://b.nano2.pl/2008/09/19/pen-tattoo-rose/</guid><category>Offtopic</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>