Kupiłem ostatnio bratu odtwarzacz Pioneer DV-420V. Niestety aby umożliwić odtwarzanie płyt DVD z różnych regionów trzeba w nim podmienić firmware.
Ściągnąłem więc odpowiednio zmodyfikowany firmware i postępowałem zgodnie z instrukcją. Jednak Odtwarzacz nijak nie chciał potraktować produkowanych przeze mnie płyt jako aktualizacji.
Po dwóch godzinach testów i grzebania w sieci znalazłem rozwiązanie: należy zmienić nazwę pliku z YKB9326C.BIN na YKF9326C.BIN. Gdy to zrobiłem wszystko poszło z górki.
Uwielbiam takie intuicyjnie proste rozwiązania…
Pioneer DV-420V i wymiana firmware 4.12.2009
JDD 09 19.10.2009
Po męczącej podróży z Krakowa czas na chwilę refleksji nad ostatnim wydaniem JDD.
Uczestnicząc w różnych wykładach ciężko było nie zauważyć olbrzymich różnic w warsztacie rodzimych prelegentów i ich amerykańskich odpowiedników. Nie chodzi mi tu bynajmniej o treść merytoryczną, a jedynie o formę.
Amerykańscy goście zawsze potrafili powiedzieć wszystko co zaplanowali trzymając się wyznaczonych ram czasowych, podczas gdy Polacy mieli wielkie problemy, żeby zapanować nad ilością wiedzy, którą chcieliby się z nami podzielić. Oczywiście większość tematów była interesująca i wniosła wiele przemyśleń, jednak niesmak pozostaje.
Irytującym również było słownictwo angielskie spolszczane i odmieniane przez przypadki (jak “skedżuling” w wykonaniu Waldemara Kota).
Mam w związku z tym postulat do prowadzących wykłady, aby ćwiczyli przed wykładem, czy są w stanie zmieścić się w czasie i ewentualnie zmniejszali ilość informacji, które chcą przekazać. Proszę również, o decyzję dotyczącą używanego języka. Mixy językowe mogą naprawdę mocno razić i spowodować negatywną ocenę mocnego merytorycznie wykładu. Wiem, że będąc widzem łatwo jest krytykować, mam jednak nadzieję, że moja krytyka będzie choć odrobinę konstruktywna ;)
Pomijając jednak te drobne, acz irytujące, tematy uważam całą konferencję za udaną. Warto było przejechać się 280km, żeby posłuchać o trendach i pomysłach pojawiających się w świecie programistów Javy. Szczególne wrażenie wywarły na mnie groovy i grails. Widzę w nich świetne narzędzie do szybkiego prototypowania aplikacji i muszę się im w związku z tym bliżej przyjrzeć.
Z niecierpliwością oczekuję już na kolejne wydanie JDD. Może tym razem uda się podejście do dwudniowej konferencji, chociaż słychać już o tym od 3 lat…
Scala – pętle i listy 4.08.2009
Kontynuuję przyglądanie się językowi Scala. Pomaga mi w tym książka Davida Pollaka Beginning Scala.
Przyjrzyjmy się jak w Scali wygląda obsługa pętli for:
scala> for {i <- 1 to 3} println(i)
1
2
3
scala> for {i for {i <- 1 to 3
j <- 1 to 3} println(i + j)
2
3
4
3
4
5
4
5
6
Jak widzimy – przy użyciu pojedynczego polecenia for – dość łatwo możemy tworzyć pętle zagnieżdżone. To nie koniec możliwości pętli for. Umożliwia nam ona ograniczanie zakresu pętli przez zwiększenie kroku, lub użycie funkcji sprawdzającej, czy dany element powinien być brany pod uwagę:
scala> for (i <- 1 to 9 by 3) println(i);
1
4
7
scala> for (i <- 1 to 9 if i % 3 == 1) println(i)
1
4
7
Pętla for wykorzystuje obiekty typu zakres (Range). Ciekawą jego własnością jest to, że elementy zakresu są fizycznie tworzone dopiero w momencie, gdy zostają one wykorzystane. Dzięki zakresom możemy również w bardzo prosty sposób tworzyć listy:
scala> (3 to 100 by 3).toList
res1: List[Int] = List(3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99)
scala> (for {i <- 1 to 100 if i % 3 == 0} yield i).toList
res2: List[Int] = List(3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99)
Listy można w łatwy sposób filtrować, usuwać, sortować, czy modyfikować elementy listy:
scala> (3 :: 6 :: 9 :: 12 :: Nil).filter(i => i % 2 == 0)
res4: List[Int] = List(6, 12)
scala> (3 :: 6 :: 9 :: 12 :: Nil).remove(i => i % 2 == 1)
res5: List[Int] = List(6, 12)
scala> (3 :: (6 :: (9 :: (12 :: Nil)))).sort(_ > _)
res6: List[Int] = List(12, 9, 6, 3)
scala> (3 :: 6 :: 9 :: 12 :: Nil).map(e => Math.pow(2,e).toInt)
res7: List[Int] = List(8, 64, 512, 4096)
Zauważmy, że Scala nie modyfikuje wartości pierwotnej listy. Wynikiem działania funkcji jest nowa lista elementów.
Scala umożliwia wykonywanie, w prosty sposób, bardziej skomplikowanych działań na listach. Funkcja reduceLeft rozpoczyna od skrajnie lewych elementów listy, wykonuje na nich zdefiniowaną funkcję i jej wynik przekazuje jako parametr do następnego wywołaniu funkcji. Jako drugi parametr przekazywany jest kolejny element listy. Operacja ta wykonywana jest dopóki nie zostaną przetworzone wszystkie elementy listy:
scala> List(3, 6, 9, 12).reduceLeft(_ + _)
res8: Int = 30
Podobną w działaniu funkcją jest funkcja foldLeft, jednak w tym przypadku wartość pierwsza wartość nie jest brana z listy, ale przekazywana jest jako parametr funkcji:
scala> List(3, 6, 9, 12).foldLeft("")(_.toString + "," + _.toString)
res9: java.lang.String = ,3,6,9,12
Oczywiście istnieją bliźniacze funkcje reduceRight i foldRight.
c.d.n.
Scala 28.07.2009
Od dłuższego czasu w moim TODO leży zapoznanie się z językiem Scala. I oto nadszedł czas na mój pierwszy rzut oka na ten język.
Scala jest silnie typowanym językiem funkcyjnym, który działa na wirtualnej maszynie Javy i może odwoływać się do klas napisanych w Javie.
Sprawdźmy na przykładach co ciekawego Scala ma do zaoferowania.
Zdefiniujmy następującą klasę:
scala> case class Osoba(imie: String, nazwisko: String)
defined class Osoba
Ten dziwny twór definiuje klasę Osoba z dwuargumentowym konstruktorem, która posiada zaimplementowane metody euqals, toString i hashCode. Dodatkowo posiada też pola o nazwach identycznych z parametrami konstruktora, które inicjowane są wartościami tych parametrów. A wszystko to dzieje się automatycznie dzięki jednemu słowu case :D
Sprawdźmy jak zadziała porównanie dwóch obiektów:
scala> val os1 = Osoba("Jan", "Kowalski")
os1: Osoba = Osoba(Jan,Kowalski)
scala> val os2 = Osoba("Jan", "Kowalski")
os2: Osoba = Osoba(Jan,Kowalski)
scala> os1.eq(os2)
res33: Boolean = false
scala> os1==os2
res34: Boolean = true
Jak widać operator == porównuje wartości obiektu, a nie referencje. Metoda eq porównuje zaś referencje. Odwrotnie niż w Javie, ale IMHO bardziej intuicyjnie.
Zdefinijujmy teraz trzy funkcje:
def biezacyCzas() = {
println("Sprawdzam czas")
System.nanoTime
}
def sprawdzCzas(t: => Long) = {
println("Parametr: "+t)
t
}
def sprawdzCzas2(t: Long) = {
println("Parametr: "+t)
t
}
i przyjrzymy się wynikom ich wykonania:
scala> sprawdzCzas(biezacyCzas())
Sprawdzam czas
Parametr: 2745273638129
Sprawdzam czas
res3: Long = 2745273796809
scala> sprawdzCzas2(biezacyCzas)
Sprawdzam czas
Parametr: 2745354364591
res4: Long = 2745354364591
Jak widzimy pierwsza funkcja sprawdź czas działa na referencji do funkcji biezacyCzas i za każdym razem, gdy następuje odwołanie do parametru t, funkcja ta jest wywoływana. W drugim przypadku do funkcji sprawdzCzas2 przekazywany jest wynik działania funkcji biezacyCzas. Zauważmy, że funkcja zwraca wartość ostatniego wyrażenia – nie ma słowa kluczowego return – chyba, że zwracanym typem jest Unit (odpowiednik javowego void), wówczas funkcja nie zwraca wartości.
Zdefiniujmy teraz następującą klasę:
class ApUp {
def apply(in: Int) = println(in.toString)
def update(k: Int, v: String) = println(k+" = "+v)
}
scala> val a = new ApUp
a: ApUp = ApUp@11f91ac
scala> a(44)
44
scala> a(33) = "Hello"
33 = Hello
Jak widzimy metody apply i update dają nam bardzo wygodne mechanizmy. Funkcje, które w języku Scala są również obiektami, wykorzystują metodę apply. Wywołanie funkcji funkcja(parametr), może być również implementowane przy użyciu metody apply: funkcja.apply(parametr). Z mechanizmu update korzysta w Scali klasa HashMap.
Na dziś wystarczy, ciąg dalszy nastąpi :)
Niebieski pas 26.07.2009
Przysiadłem ostatnio i zdałem kilka kolejnych egzaminów na Java Black Belt, dzięki czemu stałem się posiadaczem niebieskiego pasa :)

Oracle Database SQL Expert zdany 6.04.2009
Przysiadłem, pouczyłem się i zdałem egzamin Oracle Database SQL Expert, co w prostej linii prowadzi do certyfikatu Oracle Database: SQL Certified Expert.
Mimo, że od lat pracuję z Oraclowym językiem SQL, przygotowując się do egzaminu nauczyłem się kilku nowych, ciekawych konstrukcji. Potwierdza się więc maksyma, że człowiek uczy się przez całe życie.
Jboss – wstrzykiwanie właściwości (Propetries) 13.03.2009
Zastanawiałem się ostatnio w jaki sposób można aplikacjom działającym na serwerze jboss udostępnić ustawienia zdefiniowane w zewnętrznym pliku konfiguracyjnym. Niby prosta sprawa, ale nie chciałem zaszywać w aplikacji ścieżki do pliku konfiguracyjnego.
Okazuje się, że w jbossie można w bardzo prosty sposób wstrzyknąć coś do systemowych właściwości. Wystarczy wyedytować plik properties-service.xml w katalogu deploy:
<server>
<mbean code="org.jboss.varia.property.SystemPropertiesService"
name="jboss:type=Service,name=SystemProperties">
<attribute name="URLList">
http://somehost/some-location.properties,
./conf/somelocal.properties
</attribute>
<attribute name="Properties">
property1=This is the value of my property
property2=This is the value of my other property
</attribute>
</server>
Atrybut URLList jest listą oddzielonych przecinkami URLi wskazujących na pliki properties, które mają zostać załadowane. Atrybut Properties specyfikuje pary właściwości w postaci nazwa=wartość.
Teraz już bez problemów można odwoływać się w kodzie aplikacji do tak dodanych właściwości przy pomocy standardowego kodu:
System.getProperty("property1");
Dysk internetowy 19.02.2009
W sieci funkcjonuje wiele serwisów udostępniających funkcjonalność dysku internetowego. Jednak ciężko znaleźć taki, który działa jak prawdziwy dysk.
Chciałem skorzystać z takiego dysku, ale nie zadowala mnie dostęp przez www. Chciałbym zlinkować taki dysk jako katalog w moim systemie dyskowym.
Po krótkich poszukiwaniach natknąłem się na produkt spełniający ten warunek. Program nazywa się Dropbox i wydawany jest w wersji na 3 najważniejsze systemy operacyjne: Linux, Windows i MacOS.
Obsługa jego jest banalnie prosta. Po instalacji i rejestracji wskazujemy katalog, który będzie synchronizowany z dyskiem internetowym. Każdy plik, który tam przekopiujemy zostanie w tle przeniesiony na serwer Dropbox. Serwis oferuje również dostęp do plików przez przeglądarkę.
W darmowej wersji oferuje 2GB powierzchni, oczywiście za dodatkową opłatą można powiększyć swój dysk do 50GB.
Po kilku dniach używania, zauważyłem pewne problem związane z przełączaniem laptopa między sieciami firmową i domową, ale poza tym program działa bez zarzutów i mogę go polecić wszystkim, którzy nie chcą uruchamiać przeglądarki, żeby dostać się do współdzielonych plików.
Archiva 2.01.2009
Tworząc aplikacje z wykorzystaniem dobrodziejstw systemu zarządzania zależnościami Maven 2 chcieliśmy zbudować w firmie lokalny cache artefaktów wykorzystywanych w naszej aplikacji. Rozwiązań tego problemu jest kilka. Wypróbowane przez nas do tej pory to: własny serwer proxy i rsync repozytoriów zdalnych. Niestety nie zadowalały nas one w pełni.
Niedawno natknąłem się na oprogramowanie Archiva, poddałem je testom i od kilku dni używamy go produkcyjnie.
Czym wyróżnia się Archiva? Oto kilka funkcjonalności, które zadecydowały o jego przydatności:
- Zarządzanie całością odbywa się przy pomocy prostego interfejsu webowego.
- Umożliwia scalenie wielu zdalnych repozytoriów pod jednym lokalnym adresem.
- Mirroruje tylko rzeczywiście wykorzystywane artefakty.
- Umożliwia ręczne dodawanie własnych artefaktów.
- Umożliwia śledzenie zależności.
- Umożliwia śledzenie zmian przy pomocy kanałów RSS.
- Archiva umożliwia również tworzenie własnych pluginów.
Zachęcam wszystkich korzystających z mavena do przyjrzenia się temu projektowi.
Software Developers Jurnal 12.2008 3.12.2008
Kolejny numer SDJ trafia w moje ręce. Proponuję w takim razie moją subiektywną ocenę tego numeru.
Okładka informuje, że znów będziemy mieli okazję szlifować swoje umiejętności programowania gier w Symbianie. Widać temat jest interesujący dla wielu, dla mnie akurat nie, z zaciekawieniem zajrzałem więc do spisu treści, żeby przekonać się co jeszcze ciekawego może mnie spotkać w nowym numerze.
Zajrzałem i ze zdziwieniem spojrzałem ponownie na okładkę. Czyżbym pomylił pisma? Może to Chip? Linux+?
Nie jednak to SDJ! Skąd w takim razie w gazecie piszącej o programowaniu 3 długie recenzje gier na linuksa? Skąd artykuł o konfiguracji mirroringu pod linuksem? Skąd spora recenzja programu WinZip? Czyżby nie było ciekawych tematów z branży programistycznej?
Od wielu numerów Java zajmuje niewielki procent tematów poruszanych w SDJ. W tym numerze nie ma ani jednego artykułu o tematyce związanej z najpopularniejszym (według sondy na stronach SDJ) językiem programowania.
Co z tym fantem zrobić? Przestać czytać SDJ? Rezygnacja z kupowania, może doprowadzić do tego, że zniknie z rynku jedyna polska gazeta dla programistów. Może zamiast tego powinniśmy rozpocząć próby wpłynięcia na treści publikowane w piśmie dla nas?

