Archiwum na sierpień, 2007

W poniedziałek 27.08.2007 nastąpi zmiana serwera, co może implikować problemy z działaniem strony.

Około pół roku temu realizowałem referat akademicki o technologii Ajax. Dzisiaj przedstawiam pierwszą część tego opracowania.

Stworzenie bazowego projektu:

Zobacz prezentacje

XMLHttpRequest jest podstawowym obiektem języka JavaScript służącym do asynchronicznej komunikacji klienta z serwerem.

Pierwotnie obiekt pojawił się w przeglądarce Internet Explorer, a precyzyjniej w dołączanej do niej bibliotece MSXML. Z czasem został zaimportowany do innych przeglądarek, aż wreszcie został zatwierdzony przez organizację W3 w ramy standardowego elementu JavaScript (http://www.w3.org/TR/XMLHttpRequest/).

Tworzenie obiektu:

Internet Explorer 6.0 i wcześniejsze:

var http_request = new ActiveXObject("Msxml2.XMLHTTP");

pozostałe przeglądarki oraz IE 7.0:

var http_request = new XMLHttpRequest();

Dla zapewnienia działania w każdej przeglądarce można skorzystać z kodu:

var http_request = false;if (window.XMLHttpRequest) { // Mozilla, Safari, …
    http_request = new XMLHttpRequest();
    if (http_request.overrideMimeType) {
        http_request.overrideMimeType(’text/xml’);
    }
} else if (window.ActiveXObject) { // IE
    try {
        http_request = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
        try {
            http_request = new ActiveXObject("Microsoft.XMLHTTP");
        } catch (e) {}
    }
}

Zapytanie do serwera (typu “get”):

http_request.onreadystatechange = function() { /* */ };
http_request.open(’GET’, url, true);

http_request.send(null);

W pierwszej linii ustawiamy funkcję, która będzie wykonana za każdym razem gdy obiekt http_request zmieni stan (tzw. callback). Stan przechowywany jest w zmiennej http_request.readyState

    Może on przyjmować następujące wartości:

  1. 0 = niezainicjalizowany
  2. 1 = połączenie otwarte (http_request.open)
  3. 2 = żądanie zostało wysłane (http_request.send)
  4. 3 = trwa odbieranie danych
  5. 4 = odbieranie zakończone

Stany te następuje po sobie w kolejności. W praktyce sprawdza się tylko kiedy wystąpił stan 4.

Tak więc funkcję można zaimplementować następująco:

http_request.onreadystatechange = function() {
 if( http_request.readyState == 4) {
  // rób coś ciekawego
 }

};

Pełną implementacją funkcji zajmę się w dalszej części.

Polecenie

http_request.open(’GET’, url, true);

otwiera połączenie z serwerem podanym jako adres “url”. Warto nadmienić, że musi być to połączenie wykorzystujące protokół HTTP, połączenia lokalne (file://) nie działają poprawnie.

Funkcja open może przyjmować pięć parametrów (dwa pierwsze są niezbędne)

open(in DOMString method, in DOMString url, in boolean async, in DOMString user, in DOMString password)
  • method - najczęściej “GET” lub “POST”
  • url - adres docelowy
  • async - true jeżeli połączenie ma być asynchroniczne (domyślnie)
  • user, password - dane autentyfikacyjne (domyślnie null)

Polecenie

http_request.send(null);

wysyła żądanie do serwera.

Jako parametr podaje się najczęściej null gdy żądanie jest typu “GET” lub ciąg parametrów (na przykład “action=remove&id=10&time=1000000″) dla „POST’.

W celu zapewnienia poprawności przesyłanych danych powinny być one sformatowanie przy pomocy funkcji “encodeURIComponent”:

var dane = encodeURIComponent(’action’) + ‘=’ + encodeURIComponent(’test=?&;test’);

Taka postać danych powinna zostać odzwierciedlona w zmianie nagłówka “Content-Type”:

http_request.setRequestHeader(’Content-Type’, ‘application/x-www-form-urlenpred’);

Jest to wymagane w przypadku gdy method jest “POST”.

Ostatecznie, przykład wykorzystania obiektu XMLHttpRequest może wyglądać następująco:

var dane = encodeURIComponent(’action’) + ‘=’ + encodeURIComponent(’test=?&;test’);
http_request.onreadystatechange = function() {
  if( http_request.readyState == 4) {
    alert(http_request.responseText);
  }
};

http_request.open(’POST’, ’serwer’, true);
http_request.setRequestHeader(’Content-Type’, ‘application/x-www-form-urlenpred’);
http_request.send(dane);

Jeżeli teraz na serwerze utworzymy plik tekstowy o nazwie “serwer”, to po wywołaniu żądania pojawi się okienko z zawartością pliku.

Co się jednak stanie gdy plik “serwer” nie istnieje?
Zostanie zwrócony błąd o numerze 404.
W przypadku powodzenia zwrócona zostanie wartość 200.

http_request.onreadystatechange = function() {
  if( http_request.readyState == 4) {
    if( http_request.status == 200 ) {
      alert(http_request.responseText);
  } else if ( http_request.status == 404 ) alert(’Plik nie istnieje’);
    else alert(’inny błąd’);
  }

};

Zobacz prezentacje

Obok właściwości http_request.responseText występuje druga http_request.responseXML, użyteczna wówczas, gdy do komunikacji używany jest język XML.
Przykładowo jeżeli plik “serwer” będzie miał zawartość:

<?xml version="1.0"?>
<root>
    hello world
</root>

Można zawartość <root/> odczytać:

http_request.onreadystatechange = function() {
  if( http_request.readyState == 4) {
    if( http_request.status == 200 ) {
      var xml = http_request.responseXML;
      alert(xml.firstChild.firstChild.data);
  } else alert(’błąd’);
  }
};

Aby zakończyć opis obiektu XMLHttpRequest należy wspomnieć o jeszcze jednej instrukcji:

http_request.abort();

Przerywa ona połączenie na danym obiekcie i przywraca jego wartości początkowe.

Zobacz prezentacje

Pozostałe metody i właściwości klasy nie są często używane. Ich opis znajduje się w (http://www.w3.org/TR/XMLHttpRequest/).

XMLHttpRequest domyślnie używa kodowania znaków UTF-8.

Na stronie http://eclipsetutorial.sourceforge.net/ znajduje się dobrze zrealizowany kurs języka Java i środowiska Eclipse dla początkujących. 16 lekcji, każda około 10-minutowa, w formie filmu z komentarzem (po angielsku) przedstawia między innymi: tworzenie klas, JUnit, kolekcje, refactoring.
Całość dostępna jest na otwartej licencji Educational Community License 1.0.

Przygotowania następcy Compiz i Beryla idą pełną parą. Autorzy zapowiadają już stabilną wersje (0.6), projekt przestawia się bardzo interesująco.

Między innymi rozstrzygnięto konkurs na logo. Poniżej zwycięska produkcji:

compiz_fusion_logos

Popis możliwości Compiz Fusion:

Na koniec najbardziej widowiskowe pluginy (ale niestety mogą służyć wyłącznie jako wodotryski):

Źródło: List otwarty do wszystkich, którzy proszą mnie o pomoc dotyczącą komputerów (jakilinux.org)
Autorem artykułu jest Ben Brinckerhoff. Przetłumaczył: Igor Kupczyński.
Tekst dostępny na licencji: Creative Commons Uznanie autorstwa 2.5 Polska.


A więc masz problem ze swoim komputerem? Tak, dobrze trafiłeś, studiuję informatykę i wiem coś niecoś o komputerach. A czy rozwiążę Twój problem?

Na pewno spróbuję. Jesteś moim przyjacielem i cieszę się, że mogę pomóc. Mam pewne doświadczenie i naprawdę chętnie pomogę. Wiem, że na pewno zrobiłbyś to samo dla mnie. Już niedługo zwrócę się do Ciebie po darmową poradę prawną albo finansową. A także jeśli mój samochód nie będzie chciał zapalić.

Mimo to jest tutaj kilka rad, które nam obu ułatwią przejście przez to wszystko:

1. Prawdopodobnie nie znam rozwiązania od razu, więc proszę, nie denerwuj się, jeśli akurat będziemy na mieście a ja, nie powiem Ci o co chodzi. Może Cię to zaskoczy, ale raczej na pewno pierwszym co zrobię będzie przeszukanie Google. Ja po prostu posiadam odpowiednią wiedzę, aby podążać za wskazówkami z Google.
2. Mówiąc o Google, naprawdę docenię, jeśli przed zadaniem mi pytania spróbujesz sam znaleźć odpowiedź. Dostaję dużo pytań dotyczących komputerów i jest to co bądź denerwujące, jeśli odpowiedź na Twoje znajduje się na pierwszej stronie w wynikach Google. Nie, nie każę Ci poświęcać całego dnia, ale spróbuj chociaż przez pięć minut. Może akurat znajdziesz odpowiedź i zaoszczędzisz trochę czasu nam obu. Przy okazji może nauczysz się jakiejś innej ciekawej rzeczy.
3. Jeśli Google nie rozwiązuje Twojego problemu to wal do mnie. Tylko pamiętaj, że jest właściwie niemożliwym zdiagnozowanie większości problemów przez telefon. Wiem, że czujesz, że opisałeś swój problem odpowiednio, jednak dość trudno jest zrobić to zrozumiale dla innych.
4. Jeśli wpadnę popracować nad Twoim komputerem, to naprawdę nie musisz rozmawiać ze mną przez cały czas. Wiem, że starasz się być uprzejmy, ale Twój problem jest pewnie dość skomplikowany i będę musiał się skoncentrować. Raczej na pewno nie natrafiłem jeszcze na coś takiego i nie jest to usterka, którą rozwiązuję codziennie. Będę musiał trochę poczytać o tym wszystkim, a moja koncentracja spada do zera, jeśli zaczynasz opowiadać o Twoim weekendzie.
5. Za to nie będę miał nic przeciwko, jeśli zaproponujesz coś do picia albo jakąś kanapkę.
6. Bądź realistą jeśli chodzi o czas. To nie są filmy - nie będę stukał w klawisze w ekspresowym tempie i nie naprawię wszystkiego w pół minuty! Muszę wykombinować co jest problemem i spróbować go rozwiązać. To może zając z godzinę, więc proszę, nie zapraszaj mnie jeśli za pietnaście minut masz wyskoczyć do kina.
7. Przestań w kółko mnie przepraszać, jeśli będzie mi to zajmować więcej czasu niż się spodziewałeś. Doceniam Twoją troskę, ale ona niestety nie pomaga. Po pierwsze, mniej więcej wiem ile czasu sobie zarezerwować, a po drugie pewnie już się zaangażowałem, a nie znoszę zostawiać problemów bez rozwiązania. Dam Ci znać kiedy uznam, że nie potrafię pomóc, ale do tego czasu pozwól mi ocenić, czy zrobiłem dosyć.
8. Z drugiej strony pamiętaj, że dla mnie doba ma też tylko dwadzieścia cztery godziny. Jeśli powiem, że nie mogę tego naprawić w rozsądnym czasie, to nie obwiniaj mnie. Jeśli powiem, że zajmie to kilka godzin, to wiesz co - mam pewnie już zaplanowane jak spędzę najbliższe popołudnia i wieczory. Są ludzie, którzy zawodowo zajmują się rozwiązywaniem takich złożonych problemów, ale ja nie jestem jednym z nich.
9. Jeśli nie potrafię rozprawić się z Twoim problemem, to komentarze typu “Myślałem, że znasz się na komputerach? na pewno nie pomogą. Znam się na tym, z czego ja korzystam - większości narzędzia programistyczne dla systemu Unix, a nie pakiet graficzny dla Windows. Oprogramowania jest naprawdę dużo, a w szczegółach znam tylko jego niewielki procent.
10. Inny mało pomocny komentarz - “Myślałem, że studiujesz informatykę?. Informatyka nie jest o naprawianiu komputerów. Ma więcej wspólnego z matematyką, niż z pomocą techniczną.
11. Ostatnie i najważniejsze - przestań ciągle budować zamki na piasku. Jeśli już rozwiążę Twój problem, to posłuchaj moich rad, jak uniknąć go w przyszłości. Nic nie jest bardziej denerwujące niż naprawiać w kółko to samo. A szczególnie jeśli można tego łatwo uniknąć. Cieszę się, że mogę pomóc, ale altruizm ma też swoje granice.

Brzmi rozsądnie, czyż nie? Świetnie, to w czym problem?

Tekst jest luźnym tłumaczeniem ‘An Open Letter to Anyone Asking Me For Computer Help’
Autor: Ben Brinckerhoff

Przetłumaczył: Igor Kupczyński, puszczyk@gmail.com

W dniach 2-5 sierpnia bieżącego roku odbyło się w Helsinkach najważniejsze doroczne spotkanie Demosceny - ASSEMBLY Summer 2007.

Jak zawsze skupiło uwagę tysięcy ludzi z całego świata, głównie grup programistycznych oraz niezależnych twórców Sceny, który na tej imprezie premierowo przedstawili przygotowywane od wielu miesięcy dzieła.

Opadły pierwsze emocję, warto więc się przyjrzeć wynikom w różnych kategoriach:

Demo competition

W najważniejszej kategorii zdecydowanie zwyciężyła (który to już raz?) grecka grupa Andromeda Software Development (ASD) z produkcją o nazwie: LifeForce.

lifeforce_by_andromeda_software_development.avi
lifeforce_by_andromeda_software_development.zip

64k intro competition

Zgłoszone zostały tylko trzy produkcje, a rezultat głosowania jest wyjątkowo wyrównany. Można je ściągnąć z adresu:
ftp://ftp.scene.org/pub/parties/2007/assembly07/in64/

4k intro competition

Tutaj konkurencja była większa. Wygrało intro Candystall by Pittsburgh Stallers vs Loonies:
candystall_by_pittsburgh_stallers_vs_loonies.zip

Short film competition

W kategorii krótkich filmów zwyciężyła praca maxon / fake o nazwie Realtime demo wannabe.

realtime_demo_wannabe_by_maxon__fake_h264_1856kbps.mp4

Browser demo competition

Jedna z bardziej niecodziennych kategorii. Demo działa wewnątrz przeglądarki internetowej (Opera) i może wykorzystywać takie technologie jak Flash, JavaScript, SVG, Canvas i temu podobne. Zwyciężyła produkcja ADHDTV autorstwa Evoflash i BombSquad:
adhdtv_by_evoflash__bombsquad.zip

Mobile demo competition

Kolejna ciekawa kategoria. Demo działające na urządzeniach mobilnych. Zwycięzcą został Dekadence z produkcją Beertime X:
beertime_x_by_dekadence_fix.zip

Oldskool

W ramach Oldskool odbyły się wybory dema, grafiku oraz muzyki, która została przygotowana na komputery 8- i 16-bitowe.
Zwyciężyło demo High Hopes by aspekt

Grafika: Sweet Chili o Mine by Duce of Extend
sweet_chili_o_mine_by_duce_of_extend.zip

Muzyka: Decade of Dekadence by Britelite / Dekadence
decade_of_dekadence_by_britelite__dekadence.zip

Pełną listę produkcji wraz z wynikami (również nie wymienionych tutaj kategorii) można znaleźć na stronie:
ftp://ftp.scene.org/pub/parties/2007/assembly07/results.txt

Od niedawna plugin Allegro Widget jest dostępny na stronie WordPress Plugin Database.

Więcej informacji pod adresem:

http://wp-plugins.net/plugin/allegro-widget/#plugin_2697 

Ciężko nie zauważyć wielkiej popularności języka JavaScript wzrastającej nieustannie od kilku lat. Inspiracją do napisania tego posta był kolejny znakomity toolkit (właściwie to nawet pełna biblioteka) javascriptowa do wizualizacji graficznego interfejsu użytkownika. Mam tutaj na myśli OAT Framework.

Obecna wersja 2.6 wspiera kilkanaście atrakcyjnie wyglądających widgetów (między innymi bardzo efektowne Dock lub zintegrowany widget do obsługi RSS) oraz sporo innych przydatnych narzędzi (funkcje kryptograficzne, bazodanowe).

Ale niewątpliwie największe wrażenie pozostawił przykład aplikacji do modelowania baz danych napisany w OAT Framework:

http://demo.openlinksw.com/DAV/home/demo/Public/Design/employee_sales_customer_diagram2.xml

Wróćmy jednak jeszcze do kwestii popularności JavaScript. Niedawno przeczytałem, iż obecne badanie w Stanach Zjednoczonych sugerują, iż najwięcej programistów tworzy obecnie programy w JS.

Potwierdzenia postanowiłem poszukać w danych serwisu Freshmeat. Wprawdzie nie ograniczyłem się do czasu obecnego, ale sprawdziłem ile projektów wykorzystuje ten język. JavaScript znalazł się na szczytnym 7. miejscu (licząc wszystkie projekty; należy pamiętać, iż JS rzadko występuje jako jedyna technologia w projekcie).

Poniżej przedstawiam obecny ranking:

  1. C (8737)
  2. Java (5657)
  3. C++ (4746)
  4. PHP (4203)
  5. Perl (3758)
  6. Python (2826)
  7. JavaScript (1019)
  8. Unix Shell (986)
  9. SQL (538)
  10. TCL (493)

W najbliższym czasie należy się spodziewać wkroczenia na listę języka Ruby, zapewne kosztem tracącego znaczenie TCL.