Po-słowie na każdy temat

czyli programowanie i nie tylko

HTML / CSS – checkbox i radiobutton – dobra praktyka

Technologia się rozwija nieustannie. Aplikacje internetowe są ulepszane nieustannie. Czasy statycznych stron zniknęły bezpowrotnie. Wykorzystanie Javascriptu, nowinek HTML5 CSS3 to standard. Jak przeżyć w tym świecie? Pytanie z nutką ironii, bowiem teraz aplikacje przykuwają bardzo wzrok obserwatora i o tym dzisiaj parę słów.

Tworząc własną witrynę możemy wybrać jedną z 3 dróg: wykorzystać CMS, zamówić projekt graficzny lub samemu pomęczyć się w budowaniu od podstaw. O ile pierwsza droga (w przypadku darmowych CMSów) nie zamęczy naszego budżetu, o tyle druga już z dużym prawdopodobieństwem będzie to niosła za sobą. Ostatnia opcja dotyczy twórców z powołania, obeznanych w temacie i stawiających sobie wyzwania … których nie goni czas 🙂 W tym artykule trochę o nich, a więc może i o Tobie?!

Standardowe kontrolki formularzy są nudne. Nie da się ukryć. Oklepana grafika, więc oka nie zachwyca. Jednak możemy to zmienić!  Czytaj dalej…

GIT – cherry-pick, czyli jak wydłubać pesteczkę

Jest GIT? Musi być! Na początek kilka dosłownie słów na temat tego cudeńka. GIT jest rozproszonym systemem kontroli wersji (DVCS – Distributed Version Control System). Git przechowuje i traktuje informacje kompletnie inaczej niż te pozostałe systemy, mimo że interfejs użytkownika jest dość zbliżony. Rozumienie tych różnic powinno pomóc Ci w unikaniu błędów przy korzystaniu z Git. Podstawową różnicą pomiędzy Git a każdym innym systemem VCS (włączając w to Subversion) jest podejście Git do przechowywanych danych. Większość pozostałych systemów przechowuje informacje jako listę zmian na plikach. Systemy te (CVS, Subversion, Perforce, Bazaar i inne) traktują przechowywane informacje jako zbiór plików i zmian dokonanych na każdym z nich w okresie czasu. Git podchodzi do przechowywania danych w odmienny sposób. Traktuje on dane podobnie jak zestaw migawek (ang. snapshots) małego systemu plików. Za każdym razem jak tworzysz commit lub zapisujesz stan projektu, Git tworzy obraz przedstawiający to jak wyglądają wszystkie pliki w danym momencie i przechowuje referencję do tej migawki. W celu uzyskania dobrej wydajności, jeśli dany plik nie został zmieniony, Git nie zapisuje ponownie tego pliku, a tylko referencję do jego poprzedniej, identycznej wersji, która jest już zapisana.  Czytaj dalej…

Apache Tomcat – pamięć JVM

Czas na problem, z którym musi zmierzyć się każdy programista, który często pracuje na kontenerze Apache Tomcat (tutaj dotyczy wersji 6 i 7). Mowa mianowicie o błędzie  java.lang.OutOfMemoryError: PermGen space. Pojawia się on zazwyczaj, gdy w kontenerze mamy uruchomionych kilka rozbudowanych aplikacji i wykonujemy operacje re-deployu bez restartu Tomcata. Nie jest to dobre, należy to rozwiązać, ale z uwagi na złożoność problemu i często niezrozumiałość dla początkujących programistów, problem jest bagatelizowany. Owszem jest nie jest krytyczne rozwiązanie jego (występuje wyłącznie na serwerze deweloperskim) wystarcza twardy restart kontenera aplikacyjnego i „po kłopocie”. Kiedyś przyjdzie jednak zmierzyć się z rozwiązaniem problemu i zaznajomieniem się z terminami pamięci JVM (Java Virtual Machine). Czytaj dalej…

GWT – SerializationException

Cóż za udręka. Błąd nie do rozwiązania. Czyż tak nie reagujemy, gdy pojawia się „dziwny” nieprzewidziany błąd? Zdecydowanie. Najgorzej, gdy wujek Google także nic nie wie na temat błędu.

Korzystając z frameworku GWT, w wersji klient-serwer, konieczne jest operacja serializacji/deserializacji. Błąd jest z tym związany, ale o co w nim chodzi?  Czytaj dalej…

Same Origin Policy – krótka wzmianka

Kilka słów o Same Origin Policy, czyli artykuł powiązany z AJP1.3 Connector. Czy i jak można wykorzystać ww. konektor? Jednym z zastosowań i udogodnień z tym związanych jest możliwość bezproblemowego manipulowania ramkami w strukturze strony internetowej.

Zasada Same Origin Policy dotyczy właśnie manipulowania strukturą innego dokumentu w ramach obecnego dokumentu (o określonym adresie url). Gdy ramkę ze stroną generowaną przez Tomcata zagnieździmy w dokumencie HTML serwera Apache HTTP to już się domyślamy, że wszelka manipulacja (węzłami, funkcjami Javascript itp.) zakończy się niepowodzeniem z powodu tego chociażby, że główny dokument działać będzie domyślnie na porcie 80, a Tomcat np. 8080. Rozbieżność portu ogranicza nasze działania. O tym już wiecie, czas dowiedzieć się więcej na temat SOP.  Czytaj dalej…

SQL – liczby niecałkowite

Kiedy chcemy zapisać liczbę zmiennoprzecinkową (np. cenę) w większości języków programowania używamy tylu FLOAT. Okazuje się, że w języku SQL nie jest to dobry pomysł. Zachęcam do lektury krótkiego rozdziału, dokumentującego konkretny antywzorzec języka SQL.

Poniższe informacje w formie zmodyfikowanej lub nie zaczerpnięte są z książki Billa Karwina „Antywzorce języka SQL”. Polecam, jako niezbędnik programisty.

Niektóre wartości liczbowe, które możemy sobie bez trudu wyobrazić, w ogóle nie mogą być reprezentowane z zastosowaniem metody skończonej precyzji. Część programistów uważa, że takie rozwiązanie jest usprawiedliwione – skoro wartości złożonych z nieskończonej liczby cyfr i tak nie da się zapisać, każda zapisywana przez nas liczba z natury ma skończoną precyzję i tak też powinna być przechowywana w formie binarnej, prawda? Niestety nie. Czytaj dalej…

GWT – ograniczenie permutacji

Kontynuujemy dzień z Google, a konkretniej z Google Web Toolkit. Tym razem problem permutacji. Każdy programista piszący aplikacje z wykorzystaniem frameworku GWT wie, a przynajmniej powinien wiedzieć, co oznaczają permutacje podczas kompilacji programu. Załóżmy, że tworzymy aplikację wielojęzyczną w GWT – powiedzmy, że 3-języczną. Kompilator wspiera 6 silników przeglądarek, więc z prostych wyliczeń wychodzi nam niepozorna liczba 18. Co ona oznacza? Jest to liczba permutacji, jakie kompilator uruchomi podczas kompilacji aplikacji … ale jednomodułowej. Jeśli w aplikacji jest kilka modułów to liczba permutacji jest zwielokrotniona zależnie od liczby modułów. To prowadzi do frustracji, w przypadku gdy DevMode (HostedMode) nie wystarcza nam w rozwijaniu, testowaniu funkcjonalności itp. Musimy skompilować aplikację, a w przypadku tylu permutacji potrafi to trwać od kilkunastu minut do kilkudziesięciu, w zależności od posiadanego sprzętu. Jak temu zaradzić?  Czytaj dalej…

GWT – osadzanie obrazka, a jego rozmiar

Zbyt dużo pomysłów na wpisy, zbyt dużo treści do opublikowania. Ale to Was nie powinno martwić 🙂 Gorzej sprawa wygląda z czasem autora, ale powoli, powoli jakoś dam radę.

Dzisiaj mowa będzie o Google Web Toolkit i problemie osadzania obrazka na stronie. Ktoś powie „to żaden problem – ustalając szerokość lub wysokość w arkuszu stylów, przeglądarka sama dostosuje nam obrazek, a dokładniej przeskaluje nam go”. Ja odpowiem – i tak, i nie. W czym tkwi problem?  Czytaj dalej…

Apache Maven – błąd przepełnienia pamięci

apmavenTym razem szybko, krótko i przyjemnie. Skupimy się na niezbyt lubianym przez programistów błędzie java.lang.OutOfMemoryError. Niektórzy dostają dreszczy jak spotykają coś takiego na konsoli, ale tak naprawdę nie ma czego się bać. Na logikę biorą zostało zbyt mało pamięci przydzielone w stosunku do zapotrzebowania (zasobów) – lub domyślny przydział jest zbyt mały.

W związku z powyższym należy ten limit zwiększyć. Jedynym problem zatem jest zlokalizowanie miejsca gdzie, i jak tego dokonać. Osobiście spotkałem się raz z taką sytuacją. Miało to miejsce, gdy aplikacja rozwijana przez mój zespół osiągnęła (teraz już wiem) limit przydziału pamięci potrzebnej podczas kompilacji. Czytaj dalej…

Na początku był Apache – czyli połączenie serwera Tomcat z HTTP

Witam,

Czas zacząć przygodę z blogiem. Choć okoliczności nie są sprzyjające, miło mi stworzyć coś swojego, dzielić się doświadczeniem i refleksjami z życia programisty. O tym kim jestem i co robię, dowiesz się ze strony O mnie. Teraz zachęcam do lektury.

O tym, co to jest Apache HTTP, zapewne wie każdy programista aplikacji internetowych. Jednak, co to jest Apache Tomcat, już wie zdecydowanie mniej, a warto wiedzieć, bo daje on nam spore możliwości. Załóżmy, że posiadamy aplikację pisaną w Javie (lub opartą o serwer Javy – nie musi iść to w parze!) to najważniejszą rzeczą jest wybranie kontenera aplikacyjnego. Jest wiele alternatyw, np. JBoss, Apache Geronimo, Apache Jetty, ale Tomcat jest niezwykle popularny (nie ujmując pozostałym, które nierzadko są bardziej rozbudowane). Miałem przyjemność pracować z każdym kontenerem aplikacyjnym – nie zawsze długo, ale pozwoliło mi to do wystawienia subiektywnej, wewnętrznej oceny. O ile na Jetty i Tomcacie pracowało mi się przyjemnie, o tyle JBoss i Geronimo już nie pozwoliły sobie na taką opinię. Domyślam się, że musiałbym zdecydowanie więcej czasu spędzić na poznaniu ich „od środka” 🙂

Ale do rzeczy. Cały temat „połączenia” kontenerów rozbija się o moduł mod_jk,  który akceptuje połączenia na standardowym porcie (80), tłumaczy zapytanie i przesyła je do Tomcat. W ten sposób dostęp do webapp możliwy jest bez podawania portu kontenera Tomcat. Zasada działania dobrze zobrazowana jest na poniższej grafice. Czytaj dalej…