czwartek, 30 kwietnia 2009

Jazoon - rozkład jazdy

23 - 25 czerwca w Zurychu super konferencja Jazzon'09.
Jeśli nadal nie jesteś zdecydowany (a powinieneś:)) zobacz co tam się będzie działo:
program
A teraz rozkład jazdy przez cały tydzień:
Do zobaczenia w Zurychu:)

czwartek, 16 kwietnia 2009

Groovy, TDD i przenoszenie zawartośći katalogów

Od dłuższego czasu miałem zamiar poznać język Groovy, ale ciągle jakoś korzystałem z powłoki bash do pisania prostych skryptów. Dzisiaj postanowiłem to zmienić i napisać pierwszy skrypt:) który będzie przenosił katalogi z zawartością (pliki plus pod katalogi) z jednego katalogu do drugiego z użyciem clousers :)
Więc zgodnie z TDD zaczynamy od napisania testu, banalnie prostego w naszym wypadku, najpierw sprawdzimy czy po wykonaniu naszych operacji katalog zostanie pusty, pierwszy test sprawdza listRoots który ma zwrócić 1 bo będzie tylko jeden główny katalog, test 2 ma nam policzyć wszystkie pliki w naszym katalogu i o oczywiście po uruchomieniu naszego skryptu nie ma być żadnego pliku.
  1. package com.itsilesia.groovy  
  2.   
  3. def inputPath = "/Users/lipka/test/"  
  4. def outputPath = "/Users/lipka/out/"  
  5.   
  6. def inputDirectory= new File(inputPath)  
  7.   
  8. assert inputDirectory.listRoots().size() == 1  
  9. assert inputDirectory.listFiles().size() == 0  

Jak można było się spodziewać test nie przeszedł, bo katalog główny zawierał pliki i podkatalogi.
  1. Exception in thread "main" java.lang.AssertionError: Expression: (inputDirectory.listFiles().size() == 0)  
  2.         at org.codehaus.groovy.runtime.InvokerHelper.assertFailed(InvokerHelper.java:393)  
  3.         at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.assertFailed(ScriptBytecodeAdapter.java:683)  
  4.         at com.itsilesia.groovy.MoveToDirectory.run(MoveToDirectory.groovy:27)  
  5.         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
  6.         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)  
  7.         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)  
  8.         at java.lang.reflect.Method.invoke(Method.java:585)  
  9.         at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)  
  10.         at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:230)  
  11.         at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912)  
  12.         at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756)  
  13.         at org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper.java:778)  
  14.         at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:758)  
  15.         at org.codehaus.groovy.runtime.InvokerHelper.runScript(InvokerHelper.java:401)  
  16.         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
  17.         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)  
  18.         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)  
  19.         at java.lang.reflect.Method.invoke(Method.java:585)  
  20.         at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)  
  21.         at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:230)  
  22.         at groovy.lang.MetaClassImpl.invokeStaticMethod(MetaClassImpl.java:1105)  
  23.         at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:749)  
  24.         at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytecodeAdapter.java:170)  
  25.         at com.itsilesia.groovy.MoveToDirectory.main(MoveToDirectory.groovy)  
  26. Java Result: 1  

Wiec jak na razie wszystko zgodnie z planem:) teraz tylko napisać resztę kodu, żeby test przeszedł bez przeszkód:)
  1. package com.itsilesia.groovy  
  2.   
  3. def inputPath = "/Users/lipka/test/"  
  4. def outputPath = "/Users/lipka/out/"  
  5.   
  6. def inputDirectory= new File(inputPath)  
  7.   
  8. directoryMover = {  
  9.     def dir = new File(inputDirectory.getAbsolutePath()+"/"+it)  
  10.     if(dir.isDirectory()){  
  11.         def newDirectory = new File(outputPath+dir.getName());  
  12.         newDirectory.mkdir();  
  13.         dir.eachFile({  
  14.                 def currentFile = new File(it.toString())  
  15.                 def newFile = new File(outputPath+dir.getName()+"/"+currentFile.getName())  
  16.                 currentFile.renameTo(newFile)  
  17.             })  
  18.         dir.delete()  
  19.     }else{  
  20.         dir.renameTo(new File(outputPath+dir.getName()))  
  21.     }  
  22. }  
  23.   
  24. inputDirectory.list().each(directoryMover)  
  25.   
  26. assert inputDirectory.listRoots().size() == 1  
  27. assert inputDirectory.listFiles().size() == 0  


Nie wiem czy to jest dokładnie zrobione w zgodzie ze wszystkimi regułami programowania w Groovy, jeśli takie istnieją:) bo dopiero rozglądam się za jakąś książką:) ale muszę przyznać, że dzięki clousers można robić naprawdę kosmiczne rzeczy w paru liniach kodu:)
A tak wyglądała struktura katalogu przed uruchomieniem skryptu:

Uruchamiamy Netbeansa:
A wynik:

Więc jak widać wszystko zadziałało zgodnie z planem, pierwsza przeprawa z Groovy za mną :)
Jak na razie to jestem zachwycony super wsparciem dla TDD i możliwościami clousers (dużo o nich czytałem, ale nie miałem możliwości zastosowania w praktyce).

poniedziałek, 6 kwietnia 2009

10. Spotkanie Śląskiej Grupy Użytkowników Technologii Java ( Silesia JUG )

Śląska Grupa Użytkowników Technologii Java (Silesia JUG) serdecznie zaprasza wszystkich na dziesiąte spotkanie, które odbędzie się 7.04.2009 o godzinie 18:30 w COIG (Centralny Ośrodek Informatyki Górnictwa S.A.) w sali 136 na pierwszym piętrze, ul.Mikołowska 100 w Katowicach.

Temat: Web Beans

Prowadzący: Damian Łukasik

Plan prezentacji:
1. Co może być Web Beanem?
2. Dependency Injection
3. Metaadnotacje
4. Konteksty
5. Producenci, punkty wstrzykiwania
7. Interceptory, Dekoratory, Zdarzenia
8. Stereotypy
9. Mocno typowany XML
10. Integracja z J2EE

Po prezentacji (1,5h) odbędzie się krótka pogawędka (15 - 30 minut). Po prezentacji pytania dla obecnych, gdzie będzie można wygrać:
a. IntelliJ IDEA Personal License
b. ReSharper Personal License
c. TeamCity Build Agent
d. Ruby IDE Personal License

Wstęp wolny!

Zapraszam wszystkich w imieniu Damiana i Silesia JUG