Archive
Życzenia Świąteczne
Wszystkiego dobrego!
Moi czytelnicy
Moi czytelnicy
Chciałbym poznać czytelników
Postanowiłem na Was, drodzy czytelnicy, przetestować aplikację nad którą właśnie pracuję. Aplikacja służy do prowadzenia wywiadów wideo.
Hello World!
Jeżeli masz kamerkę internetową, to proszę, pomóż mi przetestować ten projekt. Sporo pracy włożyłem w zdobycie wiedzy, która pozwoliła mi na napisanie tego cuda. Jeszcze więcej pracy będę musiał włożyć w ulepszanie tej aplikacji. Proszę o opinię, komentarze i krytykę. Chociaż krytykę to może po Świętach;) Pozdrawiam
svn:externals
Nauczyłem się właśnie nowej fajnej rzeczy. Otóż zaciekawiło mnie o co chodzi w Eclipse podczas pobierania projektu z SVN:
Okazało się, że SVN ma już w sobie funkcjonalność o która od zawsze była mi potrzebna. Zwykle projekt informatyczny zawiera składa się z własnego kodu oraz z kodu wielu bibliotek. Na przykład mój projekt wykorzystuje bibliotekę swfobject. Aby z niej skorzystać powinienem w źródłach swojego projektu umieścić kod biblioteki. Tutaj z pomocą przychodzi mi svn:externals. Katalogi w moim repozytorium, mogą linkować do innych repozytoriów SVN. Na przykład:
$ svn propget svn:externals src/main/webapp/libs/
swfobject http://swfobject.googlecode.com/svn/trunk/swfobject
Wydanie tego polecenia informuje mnie, że katalog libs/swfobject powiązałem z repozytorium projektu swfobject. Aby dokonać takiego powiązania mogę posłużyć się edytorem zmiennych svn:
$ export EDITOR=mcedit.exe
$ svn propedit svn:externals src/main/webapp/libs
Tak więc, odkryłem dziś w SVN przydatną dla mnie funkcjonalność, która pozwoli mi lepiej porządkować kod źródłowy moich projektów.
Gadżety Google i uwierzytelnianie Oauth
Od pewnego czasu wersja angielska strony domowej Google (IG), wygląda nieco inaczej. Na dole strony jest przełącznik i warto z niego skorzystać. Bardzo interesującą rzeczą która już działa (niestety tylko w wersji angielskiej) są gadżety społecznościowe. To nowe API dla programistów gadżetów. Ja potrzebowałem następującej funkcjonalności. Chciałem się dowiedzieć jaki jest adres e-mail użytkownika który uruchamia mój gadżet. Niestety – nie potrafię zrobić tego wprost. Jednak kombinując z biblioteką do zarządzania kontaktami udało mi się to zrobić. Otóż odpytując ta bibliotekę zwraca ona listę kontaktów której właścicielem jest użytkownik o identyfikatorze. Ten identyfikator to adres e-mail którego szukałem;). Jak to działa – przykład jest tutaj. Przykład zadziała tylko w angielskiej wersji serwisu. Po dodaniu gadżetu w
Wyświetl się prośba o autoryzację:
Trzeba wybrać konto Google lub się zalogować
I następnie udzielić dostępu:
W ten sposób nasz zaprogramowany gadżet będzie miał dostęp do ksiązki adresowej użytkownika oraz będzie mógł sprawdzić jego adres e-mail, a także imię i nazwisko.
Niestety, adresowi e-mail otrzymanemy w ten sposób nie możemy ufać. Inny zły programista będzie mógł oszukać naszą aplikację i podać dowolny adres e-mail… Czy znacie jakiś sposób żeby gadżet google mógł sprawdzić adres e-mail zalogowanego użytkownika?
Flex i klasy prywatny
Bardzo lubię korzystać z prywatnych zagnieżdżonych klas w języku Java. Niestety, nie potrafię ich znaleźć w Action Script. To duża strata dla języka programowania. To prawie tak, jakby w języku polskim nie było przymiotników;). Problemy, które chciałbym rozwiązać prywatną klasą rozwiązuję więc w Flex w następujący sposób. Tworzę nowy plik z klasą internal class. Rzeczy, które powinny być private robię jako “interna”. Czyli w Flex mam dwie klasy w osobnych plikach lecz jednej z nich używam jako prywatnej. Właściwości języka AS3 bronią mnie przed użyciem moje klasy prawie prywatnej poza pakietem. Na przykład:
public interface INetStreamClient
{
function onMetaData(info:Object=null):void;
[…]
Czy ktoś lubi dynamiczne klasy do implementowania netStream.client – bo ja nie… (takie dynamiczne klasy wymagają zbyt wielu komentarzy). Dlatego stworzyłem ten interfejs z wszystkimi metodami zwrotnymi serwera. Następnie każda implementacja rozszerza ten interfejs. Domyślna implementacja to logowanie:
public class TracerNetStreamClient implements INetStreamClient {
public function onMetaData(info:Object=null):void {
trace(“NetStreamClient.onMetaData: “ + info + ” duration: “ + info.duration);
}
[…]
Powoli dochodzę do sedna sprawy. Mam klasę która pomaga mi odtwarzać filmy. Jednym z pól tej klasy jest “INetStreamClient”. W aplikacji jakieś inne obiekty mogą używać mojego pomocnika do odtwarzania filmów, podając mu swoja implementację klienta strumieni. Więc mam coś takiego:
public class MoviePlayer
{
[Inspectable]
public var netStreamClient:INetStreamClient;
private function createNetStream():void {
_netStream = new NetStream(netConnection);
_netStream.client = new MoviePlayerNetStreamClient(this, netStreamClient == null ? new TracerNetStreamClient() : netStreamClient );
[…]
I właśnie teraz bardzo mi zabrakło zagnieżdżonej klasy prywatnej. Chciałem wzbogacić działanie metody onMetaData. Potrzebuję klasy Proxy, której będę potrzebował tylko w tym miejscu, i która powinna mieć dostęp do prywatnych możliwości klasy MoviePlayer. Niestety w Flex tego nie ma. Dlatego radzę sobie na około tworząc klasy internal. Moje prywatne Proxy wygląda więc tak:
internal class MoviePlayerNetStreamClient implements INetStreamClient {
private var _moviePlayer:MoviePlayer;
private var _netStreamClient:INetStreamClient;
public function MoviePlayerNetStreamClient(moviePlayer:MoviePlayer,netStreamClient:INetStreamClient)
{
super();
_moviePlayer = moviePlayer;
_netStreamClient = netStreamClient;
}
public function onMetaData(info:Object=null):void {
var d:Number = info["duration"];
_moviePlayer.addDuration(d);
return _netStreamClient.onMetaData(info);
}
[…]
Jak widać, klasy prywatne mogą przydać się do implementacji wzorca projektowego dekorator. Ich brak kompensuję klasą internal. Klasa internal widoczna jest w obrębie pakietu i trzeba ją umieścić w osobnym pliku.
GMail i Gadgety Google
Właśnie odkryłem, że do Gmaila można dodawać własne Gadżety Google IG. Na przykład szachy. Aby to zrobić, trzeba przełączyć GMaila do wersji angielskie. W zakładce Labs dodać własne Gadgety po adresie URL. I znowu przełączyć się na wybrana wersję językową. Dla mnie oznacza to, że muszę popracować nad gadżetem szachów uruchamianymi na węższym ekranie.

Hasło do programu płatnik
Na temat programu płatnik napisano już wiele. Ja dorzucę jeszcze swoje trzy grosze. Hasła do programu Płatnik strzeżone są w zły sposób. Otóż jest on zbyt restrykcyjny. Hasło musi składać się z mały i dużych liter, cyfr i znaków specjalnych i musi mieć przynajmniej 8 znaków. Hasło trzeba zmieniać co miesiąc. Stare hasła są zapamiętywane i nie można i wykorzystać ponownie. W dodatku nie można tych bajerów wyłączyć. Natomiast odzyskiwanie zapomnianych haseł jest płatne i wymaga nie wiem jakich zabiegów… Po co to wszystko? Przecież wiadomo że skończy się to naklejeniem na monitor karteczki z aktualnym hasłem. Ja właśnie tak zrobiłem ignorując politykę bezpieczeństwa haseł za którą ZUS zapłacił pewnie worek pieniędzy.
Google Talk Plugin – niewypał
Dawno temu, Google było synonimem jakości. Dziś jest tak coraz rzadziej. Pisałem ostatnio o niewłaściwym zachowaniu bibliotek tworzących statystyki. Dziś poskarżę się na złe działanie produktu Google Talk Plugin – używanego do wideo czatów w GMailu. Otóż na moim raczej dobrym komputerze instalacja tego pluginu zawiesza inne aplikacje korzystające z kamery webowej. Nawet najprostszy AMCAP nie działa. Po odinstalowanie plugina Google wszystko działa poprawnie. Tak więc polecam nie używać wideo czatów Googla. Są inne dobre produkty w tej kategorii które nie stwarzają kłopotów.
