Blog PeTe

Scala – pętle i listy 4.08.2009

Zaszufladkowany do: IT, Programowanie — PeTe @ 22:16
Tags: ,

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

Zaszufladkowany do: IT, Programowanie — PeTe @ 22:34
Tags: ,

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

Zaszufladkowany do: IT, Programowanie — PeTe @ 20:43
Tags: ,

Przysiadłem ostatnio i zdałem kilka kolejnych egzaminów na Java Black Belt, dzięki czemu stałem się posiadaczem niebieskiego pasa :)
Niebieski pas Java

 

Oracle Database SQL Expert zdany 6.04.2009

Zaszufladkowany do: IT, Programowanie — PeTe @ 9:22
Tags: , ,

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

Zaszufladkowany do: IT, Programowanie — PeTe @ 23:01
Tags: , , ,

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

 

Archiva 2.01.2009

Zaszufladkowany do: IT, Programowanie — PeTe @ 12:40
Tags: , , ,

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:

  1. Zarządzanie całością odbywa się przy pomocy prostego interfejsu webowego.
  2. Umożliwia scalenie wielu zdalnych repozytoriów pod jednym lokalnym adresem.
  3. Mirroruje tylko rzeczywiście wykorzystywane artefakty.
  4. Umożliwia ręczne dodawanie własnych artefaktów.
  5. Umożliwia śledzenie zależności.
  6. Umożliwia śledzenie zmian przy pomocy kanałów RSS.
  7. 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

Zaszufladkowany do: IT, Programowanie — PeTe @ 13:19
Tags: ,

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?

 

jBPM – pierwsze kroki cz. 3 29.10.2008

Zaszufladkowany do: IT, Programowanie — PeTe @ 22:17
Tags: , , ,

Kontynuuję cykl artykułów dotyczących jBPM.

W poprzednim artykule stworzyliśmy widok pokazujący wszystkie dostępne procesy biznesowe. Nadszedł czas aby spróbować uruchomić prosty proces.

(więcej…)

 

jBPM – pierwsze kroki cz. 2 17.09.2008

Zaszufladkowany do: IT, Programowanie — PeTe @ 22:36
Tags: , , ,

W poprzednim artykule stworzyliśmy szkielet aplikacji Eclipse RCP wykorzystującej jBPM.

Dzisiaj spróbujemy stworzyć widok prezentujący wszystkie dostępne procesy biznesowe.

(więcej…)

 

jBPM – pierwsze kroki 10.09.2008

Zaszufladkowany do: IT, Programowanie — PeTe @ 23:07
Tags: , , ,

Programiści i architekci pracujący nad aplikacjami komercyjnymi często zgrzytają zębami, gdy ujrzą kolejną – ostateczną – wersję analizy procesów biznesowych klienta. Często mamy ochotę odpowiedzieć analitykowi – zrób to sobie sam! Jak się okazuje nie jest to wcale takie nierealne.

Od niedawna przyglądam się jBPM i wygląda na to, że z jego pomocą można powyższy problem rozwiązać. Szczegółowe informacje można uzyskać na stronie projektu jBPM, oraz w krótkim artykule Kamila Krasnodębskiego. Ja skupię się na praktycznych testach :)

(więcej…)