ParanoyaBLOG

programmare necesse est,
vivere non est necesse

 

Zmiana wyglądu bloga

 

Po dłuższym czasie nareszcie mój blog doczekał się swojego indywidualnego wyglądu (interfejsu). Do tej pory nie mogłem jakoś znaleźć czasu na jego „odświerzenie” czyli zmianę domyślnej skórki teraz mi się jednak to udało. Na pewno kilka osób zauważyło, że w ostatnim tygodniu wygląd bloga zmieniał się powoli acz nieubłaganie.

 

No a skoro już jest wygląd nowy to czas na wypełnienie bloga treścią, a raczej uzupełnienie kilku działów bo wypełnić to on się sam wypełni z czasem :P

 

Rozmiar obrazka bez umieszczania go na stronie

 

Czasami przydaje się informacja o rozmiarze obrazka, który można pobrać w dość prosty sposób – no chyba, że nie chcemy go umieszczać na stronie. W takim wypadku też idzie uzyskać taką informację. Wystarczy utworzyć obiekt img w pamięci i załadować do niego dany obrazek (właściwość src) w zdarzeniu onload uzyskamy wtedy dostęp do rozmiarów tego obrazka. Poniżej przykładowy kod :)

 

  1. var img = new Image();

  2. img.onload = function() {

  3.    alert(‚szerokość: ‚ + this.width + ‚px\nwysokość: ‚ + this.height + ‚px’);

  4. }

  5. img.src = ‚sciezka do obrazka’;

 

google maps w ukrytym divie

 

Wygląda na to, że Google ma problem z renderowaniem swoich map na elementach ukrytych (czy to przez display: none czy position: absolute). Mapa w takim wypadku jest źle centrowana. Dzieje się tak zapewne dlatego, że obiekty ukryte nie są przez przeglądarki renderowane i google maps ma wtedy problem z określeniem wielkości elementu, który go ma zawierać. Można na szczęście obejść tę niedogodność wywołując zdarzenie zmiany rozmiary (resize) mapy.

 

Dla wersji 2 Api kod będzie wyglądał następująco:

 

map.checkResize();

 

natomiast wersja 3 Api wymaga trochę więcej kodu :

 

google.maps.event.trigger(map, 'resize');

 

gdzie map to obiekt mapy.

 

OnClick dla <option> w google chrome

 

Przeglądarka Chrome firmy Google niestety nie obsługuje zdarzenia onclick dla tagu option w select. Oczywiście poprawniejsze jest użycie onchange samego elementu select jednak czasami zachodzi potrzeba wywołania zdarzenia onclick dla option i wtedy Google Chrome sprawia nam problemy. Na całe szczęście nie są one duże i można je w łatwy sposób rozwiązać symulując zdarzenie onclick w zdarzeniu onchange select’a – starczy do tego poniższa linia:

 

this.options[this.selectedIndex].onclick();
 

Powolne Ubuntu a Compiz

 

Przyszło mi reinstalować system i po przetestowaniu kilku dystrybucji postanowiłem pozostać wierny Ubuntu. Ściągnąłem więc i zainstalowałem najnowszą wersję (11.04). Niestety trochę się rozczarowałem. Po długich walkach z radiówką i kartą graficzną (które w wcześniejszej wersji były obsługiwane bez problemu) przyszedł czas na wydajność. Przeszukanie internetu z pomocą wujka Google zaowocowało pewnym rozwiązaniem. Otóż winny po części okazał się Compiz – może nie za wydajność jako taką lecz za płynność działania. Dla ścisłości Compiz poinstalowany był w wersji 1.0.9.4. W internecie były 2 rozwiązania:

 

  1. Downgrade Compiz’a
  2. Odpowiednia configuracja Compiz’a

 
Pierwsza z nich mi jakoś się nie uśmiechała. Na szczęście druga bardzo prosta w implementacji okazała się wyjątkowo skuteczna. Wystarczyło w opcjach wtyczki OpenGL wyłączyć Synchronizację z VBlank. Przyśpieszyło to płynność wszystkich animacji.
 
Jeden problem z głowy teraz tylko znaleźć proste rozwiązanie na szybsze uruchamianie aplikacji :P

 

Formularz i toQueryString

 

Ostatnio mi się zdarzyło, że musiałem poprawić bardzo denerwujący błąd w starym skrypcie, który wykorzystywał jedną z wczesnych wersji mootools’a. Problem występował oczywiście tylko w Internet Explorerze (testowano na wersji 7) a polegał na tym, że funkcja toQueryString() powodowała błąd „obiekt nie obsługuje takiej metody”. Dlaczego tak się działo nie mam zielonego pojęcia jednak zmusiło mnie to do napisania alternatywnej funkcji wykonywanej gdy mootools’owa funkcja zawiedzie. Nie jest ona może taka ładna i prosta w użyciu jak ta mootools’owa ale działa. Poniżej kod tej funkcji:

 

  1. function toQueryString(elem) {

  2. var queryString = [];

  3. var elements = [];

  4. try {

  5. var elements1 = elem.getElements(‚input’);

  6. if (elements1[0]) elements = elements.concat(elements1);

  7. var elements2 = elem.getElements(‚select’);

  8. if (elements2[0]) elements = elements.concat(elements2);

  9. var elements3 = elem.getElements(‚textarea’);

  10. if (elements3[0]) elements = elements.concat(elements3);

  11. } catch(e) {

  12. }

  13. if (elements[0]) {

  14. elements.each(function(el){

  15. if (!el.name || el.disabled) return;

  16. var value = null;

  17. switch (el.tagName.toLowerCase()) {

  18. case ‚select’: value = el.value; break;

  19. case ‚textarea’: value = el.value; break;

  20. case ‚input’:

  21. if (el.type == ‚radio’ || el.type == ‚checkbox’) {

  22. if (el.checked) value = el.value;

  23. } else {

  24. value = el.value;

  25. }

  26. break;

  27. }

  28. if (value != null) queryString.push(el.name + ‚=’ + encodeURIComponent(value));

  29. });

  30. }

  31. return queryString.join(‚&’);

  32. }

 

Oczywiście funkcja ta wymaga mootools’a – nie ma jednak różnicy którego :)

 

PSP a JavaScript – Wstęp

 

Da się zauważyć że PSP wyposażone zostało defaultowo w przeglądarkę stron internetowych. Da sięrównież zauważyć, że nie wszystkie a raczej większość obecnych stron nie będzie działać prawidłowo na tej przeglądarce.
 
Dlaczego ?
 
A no wygląda na to że sama przeglądarka pozostała daleko w tyle za standardami. Jej obsługa „nowoczesnych” technologii jest dość ograniczona. Posiada obsługę flasha – ale tylko do pewnego stopnia. Tak samo jest również z JavaScript.
 
Język JavaScript został w tej przeglądarce potraktowany mocno po macoszemu. Spora część funkcji, metod czy wartości po prostu nie działa (nie zostały zaimplementowane). A jak już działa to niekoniecznie w sposób prawidłowy.
 
Przykładem może być chociażby className. Właściwość className istnieje w implementacji JavaScript na tej przeglądarce. Można ją odczytać, ba … można ją nawet zapisać … ale co z tego skoro zmieniając klasę danego elementu html przeglądarka ta nawet nie drgnie … po prostu nie zareaguje na tę zmianę.
 
Jaki jest powód takich ograniczeń ? Proste niedopracowanie ? Bezpieczeństwo ? A może po prostu chęć jak największych zysków, które SONY ma z gier. Nie wiem … wiem, że taki stan jest na chwilę obecną, a czy zostanie to zmienione w kolejnych aktualizacjach oprogramowania ? … Mam nadzieje że tak :)
 
Ehh… jako, że trochę bawię się wpisanie różnorakich skryptów i programów fakt ten mnie po prostu wkurza …
 
Da się zauważyć że PSP wyposażone zostało domyślnie w przeglądarkę stron internetowych. Da się również zauważyć, że nie wszystkie a raczej większość obecnych stron nie będzie działać prawidłowo na tej przeglądarce.
 
Dlaczego tak jest ?
 
A no wygląda na to że sama przeglądarka pozostała daleko w tyle za standardami. Jej obsługa „nowoczesnych” technologii jest dość ograniczona. Posiada obsługę flasha – ale tylko do pewnego stopnia. Tak samo jest również z JavaScript.
 
Język JavaScript został w tej przeglądarce potraktowany mocno po macoszemu. Spora część funkcji, metod czy wartości po prostu nie działa (nie zostały zaimplementowane). A jak już działa to niekoniecznie w sposób prawidłowy.
 
Przykładem może być chociażby className. Właściwość className istnieje w implementacji JavaScript na tej przeglądarce. Można ją odczytać, ba … można ją nawet zapisać … ale co z tego skoro zmieniając klasę danego elementu html przeglądarka ta nawet nie drgnie … po prostu nie zareaguje na tę zmianę.
 
Jaki jest powód takich ograniczeń ? Proste niedopracowanie ? Bezpieczeństwo ? A może po prostu chęć jak największych zysków, które SONY ma z gier. Nie wiem … wiem, że taki stan jest na chwilę obecną, a czy zostanie to zmienione w kolejnych aktualizacjach oprogramowania ? … Mam nadzieje że tak :)
 
Ehh… jako, że trochę bawię się wpisanie różnorakich skryptów i programów fakt ten mnie po prostu wkurza ….

 

PDW Filebrowser – filtr *.* przy swfupload

 

W PDW Filebrowsera pod TinyMCE brakuje możliwości dodania filtru ‚*.*’ tak aby okno wskazywania plików pokazywało wszystkie pliki.
 
Ustawienie filtru ‚*’ dla $extension_whitelist powoduje, że w oknie wyboru pliku wszystkie pliki są widoczne lecz żaden uploadowany plik fizycznie nie wgrywał się na dysk.
 
Okazuje się, że w kodzie listę rozszerzeń plików „rozbijana” jest na tablicę używając przecinka jako separatora. Następnie przy wgrywaniu pliku wydziela z niego rozszerzenie i sprawdza czy takowe istnieje w powstałej przez rozbicie tablicy. Jeśli istnieje – plik jest wgrywany na dysk serwera do odpowiedniego katalogu. Jeśli nie ląduje gdzieś w kosmosie. Ustawiając $extension_whitelist na ‚*’ po takim rozbiciu uzyskuje się tablicę rozszerzeń, w której jedynym elementem jest *. Skrypt porównując rozszerzenie pliku z zawartością tej tablicy nie znalazł podobieństw i uznał, że rozszerzenie nie jest dozwolone … nie wgrał plików na serwer.
 
Problem można obejść dopisując kilka prostych linijek kodu w pliku upload.php (katalog swfupload) w linii 78.
 
Linie:
 

$is_valid_extension = false;
$allowedExtensions = explode(',', $extension_whitelist);

 
Zmieniamy na:
 

if ($extension_whitelist == '*') {
 $is_valid_extension = true;
} else {
 $is_valid_extension = false;
 $allowedExtensions = explode(',', $extension_whitelist);
}

 
Proste, łopatologiczne … acz skuteczne :P

 

Internet explorer – SELECT i innerHTML

 

Dynamiczna zmiana opcji select’a poprzez właściwość innerHTML jest dość wygodna. Jednak jak się niestety okazało na drodze do sukcesu znowu stanęły przeglądarki z rodziny Internet Explorer. Nie są w stanie obsłużyć właściwości innerHTML dla elementów SELECT. Rozwiązaniem może być mała funkcyjka :)

 

  1. function setOptions(elem, options) {

  2. elem.options.length = 0;

  3. var i = 0;

  4. var icount = options.length;

  5. for (i = 0; i < icount; i++) {

  6. elem.options[elem.options.length] = new Option(options[i][‚text’], options[i][‚value’]);

  7. }

  8. }

 

Pierwszym parametrem jest tutaj select, w którym chcemy zmienić listę opcji (pobrać go możemy chociażby poprzez document.getElementById).
 
Drugi parametr to tablica opcji. Każdy element tablicy jest obiektem składającym się z dwóch właściwości: text oraz value.
 
Tak więc po raz kolejny sprawdza się powiedzenie że nie ma drogi na skróty :/

 

Ubuntu – przyciski minimalizuj/maksymalizuj/zamknij

 

Od pewnego momentu w nowym stylu Ubuntu przyciski minimalizuj/maksymalizuj/zamknij zaczęły pojawiać się po lewej stronie belki tytułowej programów. Osobiście uważam to za nieporozumienie. Na szczęście jest na to proste rozwiązanie. Należy w terminalu wydać komendę:
 

gconftool-2 --type string --set /apps/metacity/general/button_layout "menu:minimize,maximize,close"