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
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')