wtorek, 4 listopada 2008
wtorek, 29 lipca 2008
Krok po kroczku - App Engine daje coraz więcej
Tak naprawdę ku zabawie z Django skłoniła mnie premiera Google App Engine parę miesięcy temu. Dotąd nie byłem przekonany zbytnio do programowania aplikacji webowych w Pythonie, ponieważ PHP z Zend Frameworkiem jest całkiem niezłym kawałkiem biblioteki, a przełączenie się na coś zupełnie innego wymaga nieco wysiłku z początku. Ale załączenie Django w GAE SDK było wystarczającą rekomendacją tego projektu, jako rozwiązania dojrzałego i przyjaznego programiście. Google ma zwyczaj akurat o tę grupę dbać całkiem nieźle.
Będąc na co dzień programistą J2ME/J2EE, a tylko w prywatnych projektach robionych w domowym zaciszu wykorzystując bardziej nowoczesne lub po prostu inne zabawki, możliwość poprowadzenia z praktykantem małego projekciku w technologiach tak diametralnie różnych, to swoisty ratunek zdrowia psychicznego. ;)
Nie dość że zupełnie inne biblioteki, to jeszcze jazda całkowicie bez trzymanki! Jako platforma serwerowa posłuży Google App Engine z Django 1.0 alpha, natomiast po stronie klienckiej jest nic innego jak Android, w roli nowoczesnej platformy mobilnej. MIDP to przeżytek przecież. ;)
Cieszą mnie kolejne aktualizacje App Engine, jak ostatnio wypuszczona wersja 1.1.1, która teraz pozwala na utworzenie 10 aplikacji, zamiast dotychczasowych 3. Dodatkowo poprawiono sporo błędów, więc może być tylko lepiej. Żeby tak w androidowym SDK poprawili wreszcie najbardziej irytujące niedociągnięcia...
Źródło: Google App Engine Blog
wtorek, 29 stycznia 2008
MSDN Magazine Reader
Gdy wychodził .NET Framework 3.0, Microsoft wraz z New York Times stworzył narzędzie do czytania najświeższych artykułów przechowywanych lokalnie, wykorzystujące mechanizmy synchronizacji i powalający na kolana interfejs użytkownika stworzony w Windows Presentation Foundation. Teraz w takiej formie, choć już nie tak samo efektownej, można czytać MSDN Magazine. Polecam!
piątek, 25 stycznia 2008
WikiSpider - zabawa dla geeków :)
Daniel niedawno zaproponował pewną zabawę dla programistów-geeków. Polega ona na stworzeniu aplikacji wspomagającej szukanie jak najkrótszej ścieżki między dwoma dowolnymi hasłami na Wikipedii. Była to okazja do zapoznania się bardziej praktycznego z paroma bardzo zachęcającymi nowościami w C# 3.0, przy których Java niestety wygląda trochę jak relikt (choć ją uwielbiam). Podjąłem wyzwanie, stworzyłem coś takiego, wykorzystując m.in. LINQ to XML, inicjalizatory konstruktorów, automatyczne atrybuty klas i kilka mniejszych ciekawostek (np. operator ??, typy anonimowe).
Miałem okazję też zauważyć, że w Visual Studio 2008 dodano sporo opcji refactoringu kodu - kapsułkowanie, zmiana nazw, porządkowanie importów, usuwanie tych zbędnych i sporo innych możliwości - prawie jak w Eclipse (choć przynajmniej większy porządek w menu kontekstowym). ;)
Ciekawe swoją drogą, czy ten refactoring działa z rozumieniem kodu. Świetne też są pewne niewielkie detale - przy świeżo napisanej nazwie obiektu, klasy, zmienionej nazwie dowolnego elementu kodu, proponowane jest w tagu inteligentnym rozwiązanie - czy to refactoring, czy dodanie using, czy uzupełnienie do pełnej nazwy w przestrzeni nazw. Dodatkowa niespodzianka - przytrzymajcie CTRL mając rozwiniętą listę podpowiedzi IntelliSense. :)
Rozwiązanie konkursu w niedzielę! Potem szczegóły na temat programu i link do instalacji ClickOnce. ;)
środa, 10 października 2007
Co po reinstallu?
- Notepad++
- świetny, szybki, podświetla składnię, dodaje opcję bezpośredniej edycji w menu kontekstowym Explorera
- Paint.NET
- Bardzo rozbudowany zamiennik systemowego Paint, stworzony w .NET przez pracownika Microsoftu. W pełni darmowy, obecnie wersja 3.10.
- 7-Zip
- Kombajn kompresujący i dekompresujący wszystko co potrzeba, dodatkowo we własnym, bardzo efektywnym formacie 7z.
- Foxit Reader
- Bardzo szybki i lekki czytnik PDFów. Rewelacyjna alternatywa dla Adobe Readera.
- Google Pack
- W obecnej postaci składa się na niego Google Talk i Firefox (2.0.0.7) with Google Toolbar. Google Talk ma dla mnie tą przewagę nad innymi klientami sieci XMPP/Jabber, że historia rozmów jest zapisywana na serwerze, co w moim przypadku jest ekstremalnie przydatne, gdy prowadzę rozmowy ze znajomymi z przynajmniej trzech lokalizacji. A że często w czasie rozmowy przekazujemy sobie różne przydatne informacje, można je łatwo stracić, choćby zapominając o zgraniu kopii zapasowej przy reinstallu. No i prosty interfejsik, świetnie działający transfer plików, jak i powiadomienia o nowej poczcie na skrzynce gmail.
- OpenOffice
- "Prawie" Office, choć do pierwowzoru jeszcze mu nieco daleko, ale z każdą wersją dodają niezłe ciekawostki. Z ostatnich (2.3)warto nadmienić eksport dokumentu do mediawiki, formatu znaczników wykorzystywanego w MediaWiki (engine Wikipedii).
- PuTTY i WinSCP.
- Dwa najważniejsze narzędzia do komunikacji za pomocą protokołu SSH. Pierwszy to głównie terminal, drugi transmisja plików (SCP, SFTP, ale i FTP).
- Unix Utils
- Natywne porty dla Win32 niektórych narzędzi GNU. Szczególnie przydatny jest wget.
- Sysinternals
- Niesamowite narzędzia przydatne w mniej lub bardziej awaryjnych sytuacjach, choćby Autoruns, Process Explorer.
- JkDefrag
- Prościutki i w pełni wykorzystujący Defrag API z Windows defragmentator. W wersji okienkowej, command line i w formie wygaszacza ekranu. W pełni darmowy. Obecnie wersja 3.26.
- BurnCDCC
- Bardzo prosta i użyteczna wypalarka CD/DVD/BluRay - świetne uzupełnienie dla równie użytecznych funkcji wypalania płyt w Viście.
- Eclipse
- Najlepsze pod słońcem środowisko programistyczne dla Javowców i nie tylko. Wraz z PHP Development Tools, jest także znakomite do pracy nad projektami PHP. Świetnie się także nadaje do edycji javascriptu, plików xml, css. Wszędzie podpowiadanie składni, porządkowanie kodu źródłowego. Także bardzo dobre wtyczki dla C/C++, Pythona, Perla, obsługi serwerów SQL, a nawet tworzenia diagramów UML czy edycji plików gettext. Obecnie wersja 3.3.
- Visual Studio 2005 SP1
- Instaluję także od razu, choć z racji ostatniego mojego otwierania się na wieloplatformowość, nie korzystam zbyt intensywnie, ale jak coś trzeba naklepać pod Windows, to jest to najlepsze IDE. Kropka. Muszę się tylko zorientować, jak wygląda praca z Qt Open Source pod toto. Bo właśnie chyba pod Qt będę pisał programy dowodzące mej tezy pracy magisterskiej. Jak nie będzie wygodnego sposobu, uśmiechnę się do ukochanego WTL. ;)
- Windows Live Writer
- Bardzo wygodny w użyciu edytor blogów spod marki Windows Live - pracuje z Bloggerem, Windows Live Spaces i innymi systemami wystawiającymi web services w formacie MetaWebLog i Atom API.
- Steam z wykupionym dawno temu Half-Life 2, Counter Strike:Source i Half-Life: Episode One
- Nie ma to jak czasem nieco postrzelać do nieznajomych. ;) Hardkorowym graczem nie jestem, ale Office i Assault w CS:S to moje ukochane mapy.
- Vista Codec Package
- Wbrew nazwie nie tylko dla Visty. Minimalny potrzebny do odtwarzania wszystkiego zestaw kodeków, ładnie uporządkowany i prosta konfiguracja.
- Windows Media Player Tag Support Extender
- Dodaje do Media Playera i Media Center obsługę metadanych zawartych w formatach ape, mpc, flac, ogg i innych. Niektóre tylko do odczytu, inne wraz z zapisem.
- Play Shoutcast Playlist in Windows Media Player
- Daje możliwość otwierania stacji radiowych SHOUTCast w Media Playerze.
Do tego najnowsze sterowniki do poczciwej GeForce 6600GT, Leadtek WinFast PVR2000 i wbudowanego HD Audio na Realteku.
Poustawiałem sobie tak elementy środowiska programistycznego, Apache (2.0.59), PHP (5.2.3), MySQL (5.0.45-community), Zend Framework (1.0.2), Eclipse, że po reinstalacji systemu nic praktycznie nie trzeba robić, by je odpalić. Eclipse potrzebuje jedynie JRE (1.6u3), resztę ma wbudowaną. Konfiguracja apache nie wskazuje na konkretne dyski, a tylko katalogi, wszelkie inne ścieżki są względne, wirtualne serwery wskazują na katalogi w workspace eclipsowym, a ten wszystkie moje projekty synchronizuje z CVSem postawionym na Gentoo w pokoju na parterze.
Hm. Właściwie kogo to obchodzi? :D
czwartek, 5 lipca 2007
Zend Framework 1.0 jest
Jedna z ciekawszych inicjatyw w nieco mało ustandaryzowanym światku PHP, wreszcie doczekała się pierwszej oficjalnej wersji. Zend Framework składa się z wielu przydatnych komponentów wspomagających tworzenie aplikacji webowych. Wśród nich znalazł się choćby bardzo elastyczny kontroler MVC, ACLe, obsługa sesji, walidatory danych przychodzących od użytkownika, obsługa poczty (w tym MIME), rozbudowane klasy obsługi baz danych (zarówno wspólne api dla różnych DBMSów, jak i funkcje ORM), web serwisów, prosta w użyciu klasa parsowania RSSów, obsługa przeróżnych metod "keszowania" treści, integracja z JSON i inne "ułatwiacze". Do tego obszerna i dość wyczerpująca dokumentacja! Jest on niezłą przykrywką strasznego miszmaszu, jakim jest zestaw funkcji standardowych PHP, a fakt że pochodzi prosto od Zenda narzuca wprost myśl, iż w komercyjnych zastosowaniach szybko zdobędzie uznanie i w ofertach pracy jego znajomość pojawi się jako wymagana umiejętność. ;)
Od jakiegoś czasu już śledzę postępy projektu, od czasu do czasu przymierzałem się, choć z braku tegoż nie mogłem poświęcić mu za dużo uwagi. Ale obiecuję sobie, że najbliższą okazję stworzenia "czegoś" WWW w PHP (choćby rozruszanie mojego najświeższego dziecka) wykorzystam do lepszego zapoznania się z ZF.
Polecam zarówno stronę frameworka, jak i kilka przydatnych tutoriali. To do pracy, rodacy! A tymczasem wracam do bardziej kolorowego światka.
poniedziałek, 4 września 2006
Z persystencją rozterki
Mój frejmłork webowy, zastosowany w pdaclub działa sposób nieco odmienny od MVC, ale gdyby się tam spróbować tej metodyki doszukać, to pewnie by się dało. Nie mam jednak jednego, wspólnego kontrolera frontowego. Różnymi funkcjami frameworka zajmują się różne skrypty, odseparowałem do osobnego katalogu skrypty akcji typu cynk, kontakt, wysyłanie komentarza.
Konsola administracyjna z kolei to nieco inny twór - te kwestie rozwiązuje na swój sposób, chyba bardziej zbliżony do MVC, gdyż wszystkim zajmuje się jeden skrypt, który zależnie od modułu i akcji wywołuje odpowiedzialne za nie skrypty, wykorzystując też podane parametry.
Wszędzie mam przynajmniej dobrą separację logiki od prezentacji, jednak dopiero porządnie jest to wykonane w nowej wersji Content Managera, który zadebiutuje najpierw jako intranet Urzędu Gminy Granowo, później rozbuduję o stronę internetową dla interesantów, która pozwoli załatwiać różnorakie sprawy urzędowe, sprawdzać ich stan, poczytać najnowsze wpisy do BIPu, jak i ponarzekać na gminę na forum.
Otóż kwestia samej prezentacji jest rozwiązana na zasadzie javowych resourców. Mam osobne pliczki językowe, które zawierają klucze i wartości różnych elementów interfejsu użytkownika. W szablonach stron wywołuję je tagami a'la {@zmienna}, gdzie owa zmienna jest wyszukiwana w zasobach i wybierana z pliku odpowiedniego dla aktualnego wybranego w przeglądarce. Jeśli chodzi o kwestię kontrolera i akcji, nadal występują różne skrypty dla różnych stron, jest jeden skrypt zajmujący się wywoływaniem odpowiednich metod modyfikujących informacje w portalu. Ponieważ zazwyczaj takie informacje modyfikuje się przez POST lub GET, zestaw tych klas to form-processors. Każda akcja obsługiwana jest przez osobny skrypcik, rozszerzający podstawową klasę, zawierającą metody odbierania z formularza/urla informacje, których się skrypt spodziewa, oczyszczenia ich z niebezpiecznych treści (XSS), udostępniającą też możliwość stworzenia redirecta http w razie potrzeby (akcja wymaga zalogowania lub wyższych uprawnień). Całość napisana jest w pełni obiektowo, choć muszę jeszcze wszystko dostosować do obiektowości PHP5, gdzie widać już oznaki cywilizacji.
Widok, kontroler – ok. A co z modelem? A tutaj są na razie dwie, właściwie trzy warstwy. Pierwsza to konkretne funkcje obsługi baz danych w PHP. Druga to warstwa abstrakcji - wspólny interfejs dla poszczególnych baz danych. Klasy dają możliwość zabezpieczania zapytań przez stosowne dla danej bazy ocytowywanie (quotowanie ;) ) wartości, dobierają też do zapytań ograniczanych albo LIMIT, albo TOP, zależnie czy to baza ANSI, czy MS. Nie wiem czy jednak pomysłu Microsoftu nie zbojkotować i zupełnie porzucić obsługe SQL Servera. Bo niby jak wygodnie wybrać z bazy dane stronicowane, np. drugie 20 najnowszych newsów? A jeśli chcę 20 od końca wybrać? A jak takie coś dla tabel łączonych zrobić? W MySQL czy od niedawna w PostgreSQL to jest prawie zawsze po prostu tak:
* FROM news ORDER BY date DESC LIMIT 10 OFFSET 10
Aż boję się próbować wymyślić, jak to zrobić w bazach bardziej "czystych", zgodnych z ANSI SQL, szczególnie z joinami. Może ktoś ma pomysły? Brzydactw typu zagnieżdżone SELECTy w zagnieżdżonych SELECTach nie akceptuję. ;)
Trzecia warstwa to coś a'la DAO. Są obiekty reprezentujące odpowiednie tabele w bazie i obiekty zajmujące się manipulacją na bazie za ich pomocą. Obawiałem się tutaj pewnego problemu od początku, ale chciałem sprawdzić, czy może da się to rozwiązać jakoś cywilizowanie. Co z joinami? Co jeśli dane o użytkowniku w systemie mam podzielonego między różne tabele, zawierające różne szczegóły? W jednej te podstawowe, jak login, data rejestracji, hasło, email. W drugiej szczegóły, jak nazwisko, data urodzenia, płeć. W trzeciej dane obywatela, tj. miejsce urodzenia, pesel, adres pocztowy, adres zameldowania stałego, tymczasowego, a w innej tabeli dane pracownika urzędu - biuro, telefon, stanowisko, fotka, wymiary (no, tu się zapędziłem). Do tego tabela z różnego typu własnościami uzytkownika - strona WWW, dodatkowe adresy email, komunikatory, preferencje w portalu, forum, połączona ze słownikiem wiele-do-wielu (można mieć np. kilka komunikatorów). I co teraz? Otóż to.
Postanowiłem zmienić nieco podejście i uczynić dla takiego zestawu tabel jeden obiekt, reprezentujący użytkownika. Zawierałby on dane na temat tabel "uczestniczących", byłby świadomy takich zagadnień jak klucze obce, klucze główne, a pobieranie informacji by polegało na deklarowaniu, które pola zechcę otrzymać i w zależności od tego generowałby odpowiednie zapytanie, razem z tworzeniem joinów i uwzględnianiem istnienia wielokolumnowych kluczy głównych. Do tego dochodziłaby możliwość keszowania słowników w pamięci lub w plikach na dysku, co by pozwoliło nieco zapytania odchudzić w czasie pracy systemu. Taka klasa zawierałaby zatem także informacje, która tabela to słownik, czy ów słownik może być przechowywany w pamięci podręcznej. Zbędne by było sprawdzanie w bazie daty modyfikacji słownika, bo już sama modyfikacja by przechodziła przez klasę. Co na to jury?