Dziś światło dzienne ujrzała stabilna wersja GWT 1.6, o zmianach i nowościach pisałem już wcześniej, dodatkowo nowością (przynajmniej dla mnie) jest plug-in do eclipse’a dodający parę wizardów i nowych funkcjonalności tadalafil canada. Teraz najważniejsze, gwt moża pobrać tutaj, a plugin do eclipse’a stąd ;>
Post Category → programming
GWT 1.6m2 … duże zmiany
Sesja sesją, ale w między czasie umknęły mi dwa w miarę ważne wydarzenia … myślę tutaj o 2 milestone’ach GWT 1.6.
Nie ma co tu ukrywać trochę czasu minęło, nie jest to już nowinka … ale wprowadzone zmiany w najnowszej wersji Google Web Toolkit są dość spore.
Przede wszystkim trzeba tutaj wymienić zmianę podejścia do reakcji na zdarzenia. W najnowszym GWT zrezygnowano ze wzorca obserwatora (observer pattern) na rzecz podejścia zdarzeniowego. Dodatkowo można programowo (z kodu Java’y) wywoływać zdarzenia systemowe (takie jak np. kliknięcie na przycisk) na widget’ach, w poprzednich wersjach nie było to możliwe.
GWTSchell i GWTCompiler zostają zastąpione przez HostedMode i Compiler. Dodatkowo w HostedMode zostało zastosowane Jetty (zamiast Tomcat’a) oraz dodano, jakże przydatną funkcję (jeżeli zmienia się implementację serwisów RPC lub przesyłanych encji), restartu servlet contener’a bez konieczności restartu całej aplikacji.
Kolejną ważną zmianą jest zmiana struktury katalogów w war’rze, rezygnacja z ogólnego katalogu public.
Wprowadzono dwa nowe widget’y:
- DatePicker – jak sama nazwa mówi służy do wyboru daty
- LazyPanel – załaduje zawartość panelu po pierwszej interakcji ze strony użytkownika
Standardowo, poprawiono wydajność generowanych java script’ów oraz błędy.
To na tyle szybkiego przeglądu, więcej informacji można znaleść tutaj, a samo GWT zassać można z tąd … trzeba będzie znaleść chwilę czasu żeby się przyjrzeć bliżej nowej wersji GWT 😉
cda2mpc
Parę dni temu postanowiłem zgrać moją skromną kolekcję płyt audio do formatu MPC. Nie chcąc marnować czasu (i zaśmiecać systemu zbędnym softem), postanowiłem napisać sobie mały i prosty skrycik w Python’ie. Założenia
- prostota
- automatyczność (wkładam płytę odpalam skrypt i zapominam … ;))
- zapis wyjściowych plików w pewnym ustalonym schemacie katalogów (wykonawca, nazwa albumu i utworu pisana camel case’em dodatkowo nazwa utworu poprzedzona jego numerem oraz praw dostępu: 400 (dla utworów_ i 500 (albumu))
- automatyczne pobieranie informacji o utworach bez konieczności ich przepisywania (tj. wykorzystanie CDDB, a konkretnie cddb-py)
Oto efekt (należy pamiętać żeby podmienić baseDir !):
#! /usr/bin/python """ cda2mpc, Copyrighted, 2009 Ripps directly from CD audio to musepack (mpc) format. Developed by Dariusz Luksza License: GPL v2 """ import CDDB, DiscID, re from sys import stdout from string import capitalize from os import chmod, makedirs as mkdir from subprocess import Popen, PIPE, call baseDir = '/home/lock/muzyka/' def camelCase(value): return "".join([capitalize(w) for w in re.split(re.compile("[ _]?"), value)]) print 'Getting CDDB info ...', stdout.flush() cdrom = DiscID.open() discId = DiscID.disc_id(cdrom) (queryStatus, queryInfo) = CDDB.query(discId) if isinstance(queryInfo, list): queryInfo = queryInfo[0] (readStatus, readInfo) = CDDB.read(queryInfo['category'], queryInfo['disc_id']) album = queryInfo['title'] splitAt = album.index('/') artist = album[:splitAt - 1] album = album[splitAt + 2:] print ' DONE.' print 'Starting to encoding:', artist, '-', album saveDir = baseDir + camelCase(artist) + '/' + camelCase(album) + '/' try: mkdir(saveDir, 0700) except OSError: pass for i in range(discId[1]): title = readInfo['TTITLE' + `i`] wavTrack = saveDir + 'track.wav' fileName = saveDir + `i + 1` + '-' +camelCase(title) + '.mpc' print '\tEncode track:', title , ' (', `i+1`, '/', discId[1], ')' print '\t\tStage 1 (wave) ...', stdout.flush() p = Popen(['cdparanoia', '-q', `i + 1`, wavTrack], stdout=PIPE) p.wait() if p.returncode is not 0: print ' ERROR!!' continue print ' DONE.' print '\t\tStage 2 (mpc) ...', stdout.flush() mpcCmd = ['mppenc', '--deleteinput', '--xtreme', '--silent', '--artist', artist, '--album', album, '--title', title, wavTrack, fileName] p = Popen(mpcCmd, stdout=PIPE, stderr=PIPE) p.wait() if p.returncode is not 0: print ' ERROR!' continue chmod(fileName, 0400) print " DONE.\n\tCOMPLETED." chmod(saveDir, 500) print 'COMPLETED.' call('eject') |
XMPP-PubSub w Java (cz. 2)
W poprzednim wpisie, pokazałem jak wystawić pojedynczy węzeł (node), dziś zrobię/zrobimy trochę więcej, a mianowicie opublikujemy “wiadomość”, a przede wszystkim odbierzemy zdarzenie o utworzeniu wiadomości. Przecież o tą zaletę XMPP-PubSub nam (a przynajmniej mi ;)) najbardziej chodzi … o jego zdarzeniowy charakter ;> … a więc do roboby 😉
XMPP-PubSub w Java i nie tylko (cz. 1)
W ramach eksternistycznego zaliczenia przedmiotu Systemy internetowe, muszę wykonać aplikację w architekturze SOA z wykorzystaniem
XMPP-PubSub (XEP-0060). Jako, że temat jest ciekawy i (IMHO) przyszłościowy postaram się go przybliżyć w paru notkach.
Czego można się po tych notkach spodziewać ? Przede wszystkim działających (w chwili publikacji ;)) fragmentów kodu, opisów problemów jakie napotkałem podczas realizacji projektu … oraz ich rozwiązań. Wszystko oczywiście, jak to u mnie bywa, w mniej lub bardziej chaotycznej formie ;>