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 😉

Continue reading

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 ;>

Continue reading