wtorek, 26 stycznia 2010

Sprawdź to szybko z @Grapes

W książce o Hibernate (którą sobie czytam) piszą, że uruchomienie Hibernate jest ciężkie i paskudne, bo trzeba dużo bibliotek zebrać, wrzucić na classpath i to wszystko skonfigurować. No, kilka ich jest. Jeszcze trzeba znaleźć w Internecie paczkę, ściągnąć, wybrać wymagane pliki itp. Wybrać jakąś bazę danych

To jest mało wygodne. To może maven? Hm, sprawdzam, integracja z Eclipse dalej leży choć wyraźnie się poprawiła w ostatnim roku, na Idea brak miejsca, Netbeans nie lubie. Hm, jeszcze jest Ivy...

Po analizie różnych rozwiązań, za najprostsze uznałem Grape. Grape to:
  • Deklaratywne zarządzanie zależnościami za pomocą adnotacji (@Grab).
  • To co potrzeba zostanie ściągnięte do lokalnego repozytorium i dorzucone do classpath w trakcie uruchamiania skryptu / klasy.
  • Obsługa linii poleceń – (grape install <groupid> <artifactid> [<version>])
  • Nic nie trzeba instalować jeśli ma się Groovy


Wystarczy deklaratywnie napisać czego nam potrzeba . Grape korzysta z Ivy, więc mamy dostęp do całego dobrodziejstwa znanego z repozytoriów Maven. Przykład z Hibernate:


package hello;

import javax.persistence.*;
import org.hibernate.*;
import org.hibernate.cfg.*;

//Wymagane zaleznosci:
@Grapes([
@Grab(group='org.hibernate', module='hibernate-annotations', version='3.4.0.GA'),
@Grab(group='hsqldb', module='hsqldb', version='1.8.0.7'),
//niestety slf4j i javaassist trzeba dodać ręcznie bo w POM są pewnie jako opcjonalne (lub wcale), ale domyślnie wybierane przez Hibernate
@Grab(group='org.slf4j', module='slf4j-simple', version='1.4.2'),
@Grab(group='javassist', module='javassist', version='3.4.GA')
])
@Entity
class Book{
@Id @GeneratedValue(strategy = GenerationType.AUTO)
Long id
String title
String author
String toString(){ "$title by $author" }
}

def prepareSessionFactory(){
def config = new AnnotationConfiguration()
[
"hibernate.dialect": "org.hibernate.dialect.HSQLDialect",
"hibernate.connection.driver_class": "org.hsqldb.jdbcDriver",
"hibernate.connection.url": "jdbc:hsqldb:mem:demodb",
"hibernate.connection.username": "sa",
"hibernate.connection.password": "",
"hibernate.hbm2ddl.auto": "create-drop",
"hibernate.show_sql": "true",
"hibernate.current_session_context_class": "thread"
].each{ key, value -> config.setProperty (key, value)}

config.addAnnotatedClass(Book)
config.buildSessionFactory()
}

def session = prepareSessionFactory().openSession();
Transaction tx = null;
try{

tx = session.beginTransaction()
def b = new Book(title:"Narrenturm",author:"Sapkowski")
session.persist b
tx.commit()

tx = session.beginTransaction()
Book b2 = session.createQuery("From Book").list().first()
println b2
tx = null

}catch(HibernateException e){
if(tx != null) tx.rollback()
println e
}finally{
session.close()
}


Uruchamiam z poziomu Eclipse, można też wrzucić do GroovyConsole i uruchomić, wszystkie wymagane biblioteki powinny się ściągnąć same, przykład ze strony Groovy mi dział, a ten nie... To znaczy ściąganie działa, ale Hibernate nie. Z poziomu Eclipse mi to działa, z GroovyConsole wyskakuje za to błąd dostępu do pól, ciekawe... Pewnie kwestia generowania kodu. Na razie działające Eclipse z podpowiadaniem kodu mi wystarcza, no i mały skrypt co kopiuje wszystkie biblioteki ściągnięte przez Grapes do Eclipse ;)

Update

No i minęło pół roku od ostatniego wpisu. W między czasie skończyłem studia w Polsce, pojechałem do Szwecji, tam właściwie też studia skończyłem, wróciłem, chwila odpoczynku, zachorowałem i wylądowałem na 3 antybiotykach... Teraz się doleczam i myślę, że najwyższa pora wrócić do tak zwanej "rzeczywistości".

Pracę magisterską oceniono mi na 5, a ja uważam ją za osobistą porażkę. Zabawa trwała za długo i za dużo mnie kosztowała. Przez ostatnie mniej więcej 1,5 roku zajmowałem się zabawkami na ogromnym poziomie abstrakcji. W Polsce znam tylko jedno miejsce gdzie korzystają z tych samych zabawek ale do czego innego (z pozdrowieniami dla Grześka ;) ). Praca w tym też jest tylko, że w Niemczech, Francji, Kanadzie ;) Po wstępnych badaniu kogo szukają we Francji ostatecznie stwierdziłem, że na razie nie chce wyjeżdżać.

To z kolei oznacza, że pora przypomnieć sobie Hibernate, nauczyć Spring itp.

piątek, 31 lipca 2009

Revenge of the Modelers !

Jeśli nie lubicie modelowania to mam dla was złe wiadomości… poniżej. Najpierw małą dygresja.

Wakacje wakacjami, jednak przygoda z Erasmusem kończy się dla mnie ich brakiem (przynajmniej do września). Szkoda, bo dzieje się dużo. Moda na nowe języki jak Groovy, Scala czy nawet Clojure jest w pełni... I choć uważam Scala za nie najlepszy język to i tak pewnie będę się go uczył bo
a) jest statycznie typowany z inferencją typów i domknięciami
b) Java 1.7 domknięć nie będzie mieć
c) Groovy jest wyłącznie dynamicznie typowany
d) Fan jest fajny, ale stara się za bardzo być wieloplatformowy, a ja chcę po prostu lepszą Java, chociaż...

No i dalej nie ma dobrego języka na JVM!

Ps.:
Lepsze wsparcie dla Groovy w Eclipse
http://blog.springsource.com/2009/07/30/a-groovier-eclipse-experience/
Cywilizowane wymienienie czym Fan się wyróżnia
http://fandev.org/sidewalk/topic/675

Wracając do tematu,
Jakiś czas temu wyszedł Eclipse 3.5 - http://eclipse.org/galileo/projects.php. Jeśli ktoś przeglądnie listę projektów, to zauważy 17 linków do projektów związanych ściśle z modelowaniem. W Galileo mamy nowe wersje między innymi: Acceleo, ATL, EMF, CDO, JET2, GMF, OCL, Net4J, UML2, Teneo, QVTo, Xpand i Xtext. To nie wszystkie ciekawe projekty z działu modelowanie.

Przyszły Eclipse 4 jest w całości oparty na modelach, wersja alfa (e4 0.9) jest dostępna do testów. E4 to między innym model Workbench (perspektywy, komendy, okienka, to wszystko jest modelem, który można w dowolnym momencie zmienić), deklaratywne SWT -> XWT (taki odpowiednik HTML ale dla SWT, czyli kopia XAML), port SWT na Flash(Flex właściwie) ze wsparciem Draw2D więc, definiowanie wyglądu aplikacji SWT za pomocą CSS, wsparcie dla "dowolnego" języka przy pisaniu pluginów (JavaScript z pudełka), wsparcie dla DI wbudowane w platformę. Nowa platforma ma też zmiany w swoich wnętrznościach i właściwie nie widzi różnicy w tym, czy działa przez web, czy działa stacjonarnie, czy lokalnie, czy rozproszona :)
http://download.eclipse.org/e4/downloads/drops/R-0.9-200907291930/e4-news-all.html

Eh, i pojawia się problem - coraz więcej projektów Eclipse jest oparta lub wykorzystuje EMF (Eclipse Modeling Framework), a  jest spory problem w tłumaczeniu co ta biblioteka właściwie robi. Nawet jej twórcy nie bardzo wiedzą jak ją sprzedać. No bo jeśli powiem komuś, że jest to meta metamodel z mapowaniami do Java(generacja kodu), XML Schema i UML to
a) przesadnie uproszczę temat i pominę dużo
b) słuchający ucieknie z krzykiem jak usłyszy "meta metamodel" i "generacja kodu"

Modele już nie czają się w krzakach. One atakują. Nowe projekty jak Microsoft Oslo i Quadrant, Eclipse Modeling Framework z Xtext i starym GMF, czy JetBrains MPS znalazły nową broń marketingową - DSL.

EMF nie zna litości, gdy ma się stworzony model, to nie dość, że można go bez problemu zapisać w pliku XML o dość dowolnej strukturze, to można go zapisać w pliku XMI, który każde narzędzie wspierające EMF potrafi otworzyć i edytować. Co gorsza taki model może być zapisany w zwykłym pliku tekstowym(XText), który wygląda jak nie pozorny język lub konfiguracja i jest czytelniejszy niż kod albo XML! Może też być obrazkiem jak diagram klas, albo encji(GMF). EMF również kpi sobie z baz danych i pozwala bez dodatkowej pracy się w nich przetrzymywać (Teneo, CDO),  jeśli chce to nawet można zmienić zasady zapisu do bazy danych za pomocą Hibernate lub EclipseLink i ich mapowań. EMF ignoruje fakt, że pamięć jest ograniczona, a użytkownicy rozproszeni. Pozwala pracować na modelach większych niż dostępny ram, na dodatek w dowolnej lokalizacji, wielu użytkownikom równocześnie (CDO). Aplikacja E4 RCP mogłaby mieć model UI trzymany na serwerze i wtedy można by go zdalnie zmienić, a wszyscy użytkownicy systemu natychmiast mogli by zobaczyć zmiany w swoim interfejsie!

Ciężkie czasy idą ;)

poniedziałek, 20 kwietnia 2009

Oracle = Java

Oracle kupił SUN - http://www.sun.com/third-party/global/oracle/index.jsp

Hm, no to jedna firma kontroluje bazy danych - Oracle i MySQL. To co teraz z DB2 zrobi IBM? MS SQL da sobie jakoś radę.

Pojawia się kilka zabawnych konfliktów, do rozwiązania:
  • Oracle nie wydaje mi się firmą sprzętową
  • Solaris i Linux, może Oracle przestanie kopiować RedHat Linux?
  • Netbeans, JDeveloper i Eclipse. Oracle sam komituje sporo do Eclipse (EclipseLink, WebTools), a po kupnie BEA posiada komercyjne IDE oparte na Eclipse więc przewiduje dalszą migracje do Eclipse.
  • JavaFx, JavaMe i Oracle? Brzmi dziwnie.
  • Glassfish i Bea WebLogic.
Dobrze zapowiada się rozwój JSF jak i JVM. Mam nadzieje, że Oracle docenia nowe języki jak Groovy.

No to teraz IBM powinien też kupić coś ciekawego, może SpringSource albo RedHat?

ps. No to oczekuje teraz Oracle PaaS albo Oracle Cloud Database etc.

środa, 8 kwietnia 2009

Google App Engine + Java, Groovy...

Zgodnie z przewidywaniami Java jest już obsługiwana przez App Engine, na razie dla wybranych.


a najlepsze w tym jest oczywiście


Grails jeszcze nie działa.


W praktyce nowe obsługiwane języki to Groovy, Scala, Jytho, JRuby i Rails, JavaScript(Rhino)!
I po co w ogóle zaczynali samego Python-a? Nie ma praktycznie potrzeby dodawać już innych jezyków, wystarczy popracować nad wsparciem Java.

Odnośnie samej Java to:
Servlety 2.4, JSP, JSTL, JPA, JDO, Java Mail...

Nie wiadomo co z JSF, Spring działa częściowo, Struts nie działa, Hibernate i podobne również nie. Może takie projekty jak Seam zajmą się wsparciem GAE.

Przy okazji Groovy, polecam artykuł


Moim zdaniem to działa w dwie strony. W językach dynamicznie typowanych tworzymy w testach coś co w dużej mierze sprawdza nam typy i mimo, że sprawdza je dynamicznie, to i tak pewna część kodu nie była by potrzebna. Nie widać tego, bo języki dynamiczne mają przeważnie ciekawszą składnie. Z drugiej strony w językach statycznie typowanych wdrażamy przeważnie dynamizm "kodując" w String-ach.

Groovy i Scala i C# 4 to ciekawe przykłady zmian. W Groovy można opisywać typy, ale dalej nie jest to statyczna typizacja. Scala jest statycznie typowana ale z silnym odkrywaniem typów. Ma dodatkowo składnie równie silną jak w językach dynamicznych (choć trochę przegieli) .
C# 4 to język silnie typowany z możliwym odkrywaniem typów i typami anonimowaymi (wszystko to plus lambda wyrażenia i budowa drzew składni jest potrzebne by LINQ mógł istnieć). Dodatkowo od wersj 4 będzie można powiedzieć, że wybrany element jest "dynamiczny"...

sobota, 14 marca 2009

Dropbox - kontrola wersji dla nie programistów

Systemy kontroli wersji są dobre, są też w pełni darmowe http://xp-dev.com i prawie darmowe http://assembla.com rozwiązania. 

Jednak ludzie spoza IT z nie znanych mi powodód SVN nie akceptują ;)

Dropbox to aplikacja która pozwala na synchronizowanie danego folderu między wieloma komputerami wraz z kopią w internecie. Darmowa wersja pozwala na przechowywanie 2 gb danych i trzyma historię ich zmian.

image

Dropbox pozwala na współdzielenie folderów (ludziki na folderze Magisterka), udostępnianie folderu publicznie w internecie (jak również widać na rysunku) i teoretycznie działa na Windows, Linux i Mac.

Wystarczy zapisać dowolny plik w odpowiednim folderze, a ten automatycznie zostanie wysłany do internetu i synchronizowany z zarejestrowanymi komputerami.

W internecie możemy przeglądać pliki (włącznie z ich historią)

image

A zdjęcia są dostępne w postaci galerii, którą również można opublikować

image

Można uzyskać dodatkowe 250 MB dla siebie (i dla mnie) korzystając z tego linku:

  https://www.getdropbox.com/referrals/NTQ4NDY0Mzk

wtorek, 10 marca 2009

Eclipse CDT i inne narzędzia do C++

W zeszłe wakacje miałem ciekawy projekt i właśnie znalazłem zaległy post z tego czasu :)

Po 3 lata z Java i C# można zapomnieć co to jest segmentation fault albo destruktor. Jednak język to tylko narzędzie, jedno z wielu, a jeden telefon może sprawić by znów używać najlepszy i najgorszy z języków jakim jest C++. Na miejscu zbrodni zastałem Visual Studio 6. No tak, w sumie w zakresie C++ w Visual Studio względnie nie wiele się zmieniło przez te 10 lat, chociaż teraz jest to produkt darmowy również do zastosowań komercyjnych (trochę okrojony). W VC6 już pierwszego dnia, zaraz po ustawieniu środowiska i integracji z CVS (czyli instalacji WinCVS. Trudno o dobry plugin do jakiegokolwiek systemu kontroli wersji dla VS), przestała działać nawigacja po kodzie i autocompletion (lub jak kto woli IntelliSense). Wystarczy usunąć jeden plik i znów działa. Hmm, czekaj czekaj gdzie są zakładki w tym narzędziu? Nie znalazłem. Po trzech dniach uznałem, że cała gadanina o tym, że Java jest wolna nie może być dalsza od prawdy. Ctrl+S w VC6 oznacza, że mogę iść po wodę, po zmianie jednego pliku kompilacja oznacza, że mogę iść zrobić kawę. Problemu z Ctrl+S nie zniosłem, bo mam zwyczaj często ten skrót używać i pisać dalej, a nie czekać min. 30 sekund aż mi środowisko zacznie odpowiadać (nie VS6 nie ma czegoś takiego jak autobuild, nie ta liga, ot tak się po prostu działo). Pora poszukać alternatywy. Dawno, dawno temu używałem DJGPP, później prawdopodobnie największego przegranego wśród zwycięzców: bardzo dobrego C++ Builder 6. Również Dev-Cpp(ciekawe, wersja 5 jest wersją beta od przynajmniej 4 lat) i całkiem udany Code::Block który o ile dobrze pamiętam świetnie integrował się z darmowym kompilatorem od Borland. Oprogramowanie zmieniało się w razie potrzeby, odgórnej dyrektywy, dostępności licencji, ramu i wyposażenia biblioteki, stąd spora liczba środowisk których używałem (pomijając linuxowe jedno-projektowe przygody jak Anjuta). Przyszedł też czas na VS 2003 i skończyło się na VS 2005 - to było moje ostatnie środowisko, w którym używałem C++. Może przy okazji dam jeszcze szansę VS 2008. W omawianym zleceniu okazało się, że Notepad++ jest bardziej ergonomiczny niż VC6. Czasem lekki edytor jest wszystkim czego potrzeba. Przynajmniej póki tworze kod. Brakowało mi jednak możliwości efektywnego przeglądania tego co jest napisane (a jest tego dużo). No i czy naprawdę muszę odpalać kompilację, by dostać stos głupich błędów z powodu braku średnika ? Pora poszukać lepszego rozwiązania.



W praktyce z darmowych narzędzi polecam uwadze:

  • Eclipse CDT - systemy wbudowane, oprogramowanie dla Linux i podobnych, oraz jako "lekki" edytor plików cpp.
  • VS 2008 - oprogramowanie dla Windows, gry (choć wszędzie lepiej pasuje płatna wersja :) )
  • Code::Blocks - wszędzie ;) - lekkie choć kompletne IDE na różne platformy
  • MonoDevelop - Linux i/lub GTK, wygląda bardzo obiecująco - prosty i wystarczający, nie miałem okazji używać.
VC2008 odpadło z przyczyn środowiskowych. Zostaje Code::Blocks i Eclipse CDT. Już na wstępie Code::Blocks ma przewagę - obsługuje wszystkie sensowne kompilatory i projekty za równo VS jak i Dev-Cpp. Eclipse w praktyce wymaga gcc i gdb, na Windows działa to marnie i potrzeba Cygwin lub Mingw, a projekty portować trzeba ręcznie. Z drugiej strony Eclipse mogę wpiąć jako edytor w projekt nie zmieniając oryginalnego projektu, dalej mam dużo ciekawych. Niestety brak kompilacji i debug. Ostatecznie korzystałem z Notpad++ do szkicu kodu (tydzień pisania samego pseudokodu dla pierwszej wersji algorytmu :) ), Eclipse CDT do edytowania / chodzenia po kodzie i Visual Studio do kompilacji i debug. Eclipse CDT ma własny parser i stara się równać poziomem do JDT. To nie jest proste ze względu na specyfikę C++. Mimo to dostaje się mnóstwo dobrych dodatków jak śledzenie "include" (które bierze pod uwagę stan zmiennych preprocesora), nawigacja po kodzie metodą Ctrl+Click, inteligentne podpowiedzi edytora, wyszukiwanie elementów, podstawowy refactoring, outline, Mylyn itp.

Linki: