TechFlash dotyczący GWT już za nami. Spotkanie prowadził Jakub Ściuba, a kameralna liczba uczestników pozwoliła na wprowadzenie dość luźnej dyskusji na temat GWT, frameworktóry webowych w ogóle i krótkiej dyskusji nt. wzorca MVP.
Prezentacja została podzielona na dwie zasadnicze części:
Wprowadzenie
Przedstawienie historii projektu Google Web Toolkit, zestaw podstawowych komponentów. Na jednym ze slajdów Kuba zaprezentował kto używa GWT, pokazując nawet firmy z polskiej branży ubezpieczeniowej.
Ćwiczenia
Rozpoczęliśmy ambitnie od odpalenia klasycznego HelloWorld z użyciem maven archetype (dla IDEAowców) lub wizard (dla Eclipse). Ten etap udało się dość sprawnie wykonać i osoby mające już wstępnie skonfigurowane IDE miały sporo łatwiej.
Następnym krok to ćwiczenie wprowadzające w komponenty GWT, po którym przeskoczyliśmy do aktywacji GWT Super Dev Mode. Konfiguracja i brak wsparcia out-of-the-box dla Eclipse i IDEA zatrzymały nas niestety przy tym ćwiczeniu na dłużej.
Kolejny, acz budzący sporą dyskusję wśród uczestników temat to wbudowany w GWT mechanizm AutoBean. Krótki live code pokazał podstawowe idee tego frameworku.
Z uwagi na krótki ograniczony czas prezentacji musieliśmy zadowolić się jedynie teorią związaną z Appearance Pattern promowanym przez Sencha w produkcie Ext-GWT.
Ogromne podziękowania dla Kuby, pokazał wybrane i dość zaawansowane techniki GWT! Mam nadzieję, że temat będzie kontynuowany, gdyż najtrudniejsze (czyli konfiguracja środowiska dla super dev mode) mamy już za sobą i szkoda byłoby nie wykorzystać szansy na chociażby zapoznanie się ze standardową biblioteką komponentów i zweryfikowania szybkości kodowania w tej technologii.
Z niecierpliwością czekamy na materiały, które wrzucę, jak tylko otrzymam od Kuby
Poniżej zdjęcia z prezentacji.
2013-05-06
2013-05-01
TechFlash 2013-05-06 GWT
Po udanej majówce nasze mózgi będą wypoczęte, co należy wykorzystać do wtłoczenia w nie trochę przydatnej wiedzy. TechFlash!
W poniedziałek o 16:00 będziemy się uczyć o GWT. Prowadzącym będzie Jakub Ściuba, który przegryza się przez GWT od dwóch lat.
Serdecznie zapraszam, szczególnie osoby, które chciałyby się przekonać do nieco nowszych (aczkolwiek ugruntowanych) technologii webowych.
Ważna uwaga: Mając na uwadze fakt, że w zdrowym ciele zdrowy duch, a sport to zdrowie nie chcemy kolidować z przesuniętą właśnie na środę piłką. Przenosimy więc TechFlash na poniedziałki.
A więc jak będzie zorganizowany najbliższy TechFlash?
Miejsce i termin:
Siedziba Decerto,
Postępu 15 B,
sala konferencyjna
2013-05-06, 16:00-18:00
Agenda:
Wymagania dodatkowe:
Formuła:
Spotkanie ma formułę mini-warsztatów, gdzie część prezentacyjna stanowić będzie jedynie 5-10% całości spotkania, a pozostała część posłuży praktycznemu poznaniu technologii. Warto więc przynieść swojego laptopa. Spotkanie ma luźną formułę, gdzie dyskusje i wymiana doświadczeń są mile widziane i pożądane. To także miejsce dla osób chcących jedynie biernie posłuchać tego, co ma do powiedzenia prelegent. Standardowo, w przerwie około 17:00 przyjedzie Pizza!
Zainteresowany uczestnictwem? Napisz mail-a do tomasz.kucharski@decerto.pl
W poniedziałek o 16:00 będziemy się uczyć o GWT. Prowadzącym będzie Jakub Ściuba, który przegryza się przez GWT od dwóch lat.
Serdecznie zapraszam, szczególnie osoby, które chciałyby się przekonać do nieco nowszych (aczkolwiek ugruntowanych) technologii webowych.
Ważna uwaga: Mając na uwadze fakt, że w zdrowym ciele zdrowy duch, a sport to zdrowie nie chcemy kolidować z przesuniętą właśnie na środę piłką. Przenosimy więc TechFlash na poniedziałki.
A więc jak będzie zorganizowany najbliższy TechFlash?
Miejsce i termin:
Siedziba Decerto,
Postępu 15 B,
sala konferencyjna
2013-05-06, 16:00-18:00
Agenda:
1. Czym jest GWT
2. Historia
3. Pierwszy widget
4. Rodzaje debugowania
5. Appearance Pattern
6. AutoBean
7. Editors, Drivers
8. Podsumowanie - porównanie bibliotek GWT
Wymagania dodatkowe:
- Eclipse
- Google Plugin for Eclipse (https://developers.google.com/eclipse/docs/download)
- maven lub ściągnięty GWT SDK w wersji co najmniej 2.5.1
Formuła:
Spotkanie ma formułę mini-warsztatów, gdzie część prezentacyjna stanowić będzie jedynie 5-10% całości spotkania, a pozostała część posłuży praktycznemu poznaniu technologii. Warto więc przynieść swojego laptopa. Spotkanie ma luźną formułę, gdzie dyskusje i wymiana doświadczeń są mile widziane i pożądane. To także miejsce dla osób chcących jedynie biernie posłuchać tego, co ma do powiedzenia prelegent. Standardowo, w przerwie około 17:00 przyjedzie Pizza!
Zainteresowany uczestnictwem? Napisz mail-a do tomasz.kucharski@decerto.pl
2013-04-10
TechFlash - JavaFX
Kolejny TechFlash za nami!
Ogromne podziękowania dla Zbrojnego i wszystkich uczestników!
Możliwość kodowania, błyskawiczne wprowadzenie do JavaFX, bardzo ciekawa dyskusja oraz kontrowersyjne tezy - to wszystko ominęło tych, którzy nie przyszli :)
A przy okazji była możliwość sprawdzenia w boju środowisko NetBeans :) No i pizza!
Co pozostało z dzisiejszej prezentacji dla nie mogących uczestniczyć w dzisiejszym spotkaniu?
- Prezentacja Power Point - dostępna tutaj
- Kody źródłowe ćwiczeń - będą w przeciągu kilku dni w naszym nowym repozytorium GIT (widocznym także dla pracujących "na froncie"). Projekt decerto/techflash/javafx.git
- Filmik z rozpoczęcia TechFlash...
- Zdjęcia....

![]() |
Przyjechała piza |
2013-03-27
TechFlash - MongoDB
Tym razem poświęcamy się tematowi NoSQL, a w szczególności bazie MongoDB. Warto wiedzieć, że rozwiązania typu Big Data (a więc właśnie m.in. MongoDB) zostały zidentyfikowane w raporcie Gartnera na 2013 rok jako jedne z najbardziej wpływowych technologii w świecie IT [1]. Temat poprowadzi znany już w firmie NoSQL-owiec, Piotr Sobolewski.
Warto wiedzieć, w którą stronę biegnie świat IT!
Miejsce i termin:
Siedziba Decerto,
Postępu 15 B,
sala konferencyjna
2013-03-27, 16:00-18:00
Agenda:
1. Wprowadzenie do tematu NoSQL
2. Czym jest dokumentowa baza danych?
3. Operacje na dokumentowej bazie danych
4. Denormalizacja schematu danych
5. Need for Speed - zwiększmy wydajność
6. Aggregation Framework
7. Skalowalność = replikacja + partycjonowanie danych
8. Wsparcie dla języków programowania
9. Q&A
Wymagania dodatkowe:
Ściągnij odpowiedni dla danego systemu operacyjnego serwer: http://www.mongodb.org/downloads
Formuła:
Spotkanie ma formułę mini-warsztatów, gdzie część prezentacyjna stanowić będzie jedynie 5-10% całości spotkania, a pozostała część posłuży praktycznemu poznaniu technologii. Warto więc przynieść swojego laptopa. Spotkanie ma luźną formułę, gdzie dyskusje i wymiana doświadczeń są mile widziane i pożądane. To także miejsce dla osób chcących jedynie biernie posłuchać tego, co ma do powiedzenia
prelegent. Standardowo, w przerwie około 17:00 przyjedzie Pizza!
Podsumowanie:
Największe oczywiście podziękowania należą się Piotrowi Sobolewskiemu, który przygotował kawał naprawdę dobrej prezentacji okraszonej dobrymi przykładami.
Dla tak starego człowieka jak ja tempo ćwiczeń było bardzo szybkie i z częścią nie nadążyłem :), ale 2h pompowania wiedzy dały mi więcej niż 6h ślęczenia nad dokumentacją!
Nie wspomnę oczywiście o końcowym przykładach kodu Java + Spring + MongoDB , które pokazały, że cała technologia jest absolutnie łatwa do wykorzystania w naszym ulubionym języku programowania :)
Piotr odwalił kawał dobrej roboty, prezentacja na wysokim poziomie! W imieniu całego zespołu Decerto i swoim dziękujemy!
2013-03-07
Spring MVC i ajax
System, którego utrzymaniem i rozwojem zajmuję się na co dzień to w większości procesy backend'owe - logika biznesowa, cykliczne procesy wykonywane automatycznie w tle. Oczywiście system posiada również interfejs użytkownika, ale nigdy przy jego tworzeniu nie przykładaliśmy większej wagi do jego użyteczności i ergonomiczności. Jego podstawy tworzone były ładnych kilka lat temu i daleko mu do funkcjonalności obecnie popularnych interfejsów web'owych.
Ostatnio trafiło do mnie zadanie które oprócz modyfikacji procesów biznesowych wymagało również przygotowania odpowiedniego GUI. Uznałem zatem że nadarzyła się świetna okazja do poznania kilku nowych rzeczy i przyjrzenia się wreszcie trochę dokładniej tematowi w jaki sposób Spring MVC może współpracować z jQuery i z Ajaxem. Przejrzałem kilka przykładów, for internetowych. W tym poście postaram się zebrać tą wiedzę w całość i przedstawić na jak najprostszym przykładzie w jaki sposób zmusić kontrolery Spring'owe do obsługi asynchronicznych requestów i jak je obsługiwać zarówno po stronie serwera jak i klienta.
Na początek utwórzmy aplikację HelloWorld w SpringMVC.
Do budowania aplikacji wykorzystamy maven'a, zatem musimy przygotować odpowiedni plik pom.xml, który powinien wyglądać tak:
Aplikację nazwiemy springAjax.
Ja wykorzystałem wersję spring'a 3.0.5, ale oczywiście nic nie stoi na przeszkodzie aby użyć innej. W pliku pom.xml wystarczy podać bibliotekę spring-webmvc. Pozostałe wymagane biblioteki spring'a zostaną dociągnięte automatycznie przy aktualizacji zależności.
W następnej kolejności zdefiniujmy plik web.xml dla naszej aplikacji.
Aby requesty obsługiwane były przez odpowiednie kontrolery spring'owe, należy zdefiniować servlet org.springframework.web.servlet.DispatcherServlet i określić odpowiedni pattern, który będziemy wykorzystywać w naszej aplikacji. Załóżmy zatem że wszystkie requesty o masce *.mvc będą obsługiwane przez Spring'a.
Zawartość tego pliku dla aplikacji helloWorld powinna wyglądać następująco:
Pora na zdefiniowanie widoku.
W katalogu WEB-INF załóżmy katalog jsp/ w którym będziemy umieszczać nasze pliki.
W nim zakładamy plik springAjax.jsp o zawartości:
W kolejnym kroku musimy zdefiniować plik konfiguracyjny do SpringMVC.
Można to zrobić na dwa sposoby - wskazać plik konfiguracyjny w pliku web.xml, lub utworzyć plik o nazwie której domyślnie poszukuje Spring, czyli nazwaServletu-servlet.xml. Jako że robimy wersję najprostszą wykorzystamy wersję drugą, czyli w katalogu WEB-INF tworzymy plik o nazwie springAjax-servlet.xml. Jego zawartość powinna być następująca:
W pliku określamy pakiety które będą skanowane pod kątem obecności beanów spring'owych.
W naszym przypadku będą to :
- pl.decerto.controller (w którym będziemy umieszczać kontrolery)
- pl.decerto.service (w którym będziemy umieszczać dodatkowe serwisy).
Dodatkowo musimy zdefiniować bean ContentNegotiatingViewResolver który wyszukuje odpowiedni widok na podstawie requestu.
Określamy, że wszystkie requesty z rozszerzeniem *.mvc będą typu text/html.
Definiujemy domyślny resolver do widoków UrlBasedViewResolver oraz prefix i suffix.
Mamy kompletną konfigurację.
W następnym kroku tworzymy kontroler. Umieścimy go w pliku pl.decerto.controller.SpringAjaxController
Adnotacja @Controller określa, że klasa zawiera kontroler Spring MVC
Adnotacja @RequestMapping określa pod jakim URL'em dostępny będzie nasz kontroler. Tą adnotację możemy stosować zarówno dla całej klasy jak i dla poszczególnych metod. W podanym przykładzie zdefiniowałem URL na poziomie klasy. Dodatkowo na poziomie funkcji określiłem jaki parametr URL'a zdecyduje o tym że dana funkcja zostanie wywołana oraz jaką metodą będzie można ją wywołać (w tym przypadku GET). Funkcja nie robi nic innego oprócz zwrócenia nazwy widoku jaki ma zostać wyświetlony (czyli "springAjax").
Jako że w pliku springAjax-servlet.xml określiliśmy wcześniej prefix "WEB-INF/jsp" oraz suffix ".jsp", podanie nazwy widoku "springAjax" spowoduje wyświetlenie pliku "WEB-INF/jsp/springAjax.jsp"
To już cała konfiguracja aplikacji HelloWorld w springMVC. Możemy zbudować aplikację, deploy'
ować na przykład w Apache Tomcat i uruchomić.
Po uruchomieniu Tomcat'a i w pisaniu w przeglądarkę adresu:
powinniśmy zobaczyć "HELLO WORLD!"
Po tym przydługim wstępie możemy przystąpić do właściwej części, czyli do wykorzystania Ajax'a.
Obsługa ajaxa odbywa się za pomocą formatu JSON (JavaScript Object Notation). W uproszczeniu można powiedzieć że mechanizm ten służy do serializacji i deserializacji obiektów.
Potrzebujemy zatem mechanizmów do obsługi JSON'a zarówno po stronie klienta (JavaScript) jak i po stronie serwera (SpringMVC).
Po stronie klienta wykorzystamy do tego chyba najpopularniejszą bibliotekę JavaScriptową JQuery w połączeniu z plugin'em serializeForm, który można znaleźć pod tym adresem:
Tworzymy zatem w katalogu webapp naszej aplikacji folder "js" i wrzucamy do niego serializeForm.js oraz jquery i jquery-ui, które przyda nam się do utworzenia okienka dialogowego. Pakiet znajdziemy tutaj:
Po stronie serwera natomiast wykorzystamy bibliotekę Jackson. Informacje o niej znajdziemy na stronie:
Aby dodać ją do projektu wystarczy dopisać do pliku pom.xml następujące zależności:
i wykonać mvn install
Odpowiednie biblioteki powinny zostać dociągnięte do projektu
Następnie musimy zmusić SpringMVC żeby poprawnie obsługiwał requesty json'owe. Dodajemy zatem do pliku springAjax-servlet.xml definicję dwóch bean'ów, które odpowiadają poprawną serializację i deserializację danych do formatu JSON:
Dzięki temu nasz kontroler spring'owy będzie poprawnie obsługiwał mediaType application/json.
Załóżmy zatem, że chcemy zrobić formularz, za pomocą którego tworzymy prostą listę użytkowników jakiegoś systemu. Na jednym ekranie zrobimy listę dodanych użytkowników, przycisk do dodawania nowej pozycji, po wciśnięciu którego pojawi się okienko dialogowe z odpowiednim formularzem.
Zatwierdzenie formularza spowoduje dodanie nowego wiersza do tabelki. Dodatkowo w okienku dialogowym pojawi się combo box, który również będzie wypełniany ajax'em (trochę "na siłę", ale chodzi o pokazanie przykładu :) )
Nasz plik jsp będzie wyglądał zatem tak:
Pojawiły nam się include'y javascript'ów i stylu CSS do okienka dialogowego (który powinien być pobrany wraz z jquery-ui, oraz include pliku springAjax.js.
Pojawiła się również tabelka, z <tbody id="userTable"> do którego dopisywać będziemy nowe wpisy.
Pojawił się <div id="dialog-form"> w którym zawarty jest formularz <form id="userForm"> w którym wypełniać będziemy dane użytkownika.
W pliku springAjax.js umieściłem wszystkie funkcje JS związane z obsługą requestów ajax'owych i obsługą okienka dialogowego.
Zawartość pliku springAjax.js jest następująca:
Zmodyfikowałem również kontroler, który obecnie ma postać następującą:
Przejdźmy zatem do obsługi najprostszego requestu ajax'a - wypełnimy combo z rolami na podstawie danych pobranych asynchronicznie z serwera.
W tym celu wykorzystamy funkcję refreshRoles() którą utworzyłem wcześniej w pliku springAjax.js
funkcja $.getJSON jest wbudowana w JQuery i służy do pobrania danych z serwera w postaci JSON za pomocą requestu typu GET. Funkcja callback (wykonywana po zrealizowaniu requestu asynchronicznego) czyści nasze combo o id="role", iteruje po otrzymanych elementach i dodaje odpowiednie opcje do combo. W tym przypadku wywołana została metoda kontrolera o nazwie loadRoles().
W funkcjach kontrolera obsługujących requesty ajax kluczowa jest adnotacja @ResponseBody. Spring otrzyma request, rozpoznaje że odpowiedź powinna być serializowana do postaci JSON (wykorzystany jest zdefiniowany wcześniej w konfiguracji bean jacksonMessageConverter), i odesłana bezpośrednio jako responseBody, z pominięciem standardowych nagłówków HTTP.
Wykorzystana klasa RoleDTO wygląda następująco (najprostszy obiekt słownikowy):
Dane wprowadzanych użytkowników będziemy przechowywać w obiektach typu UserDTO o następującej postaci:
Dodatkowo utworzyłem serwis o nazwie SpringAjaxService.java, w którym umieściłem metody zarządzające danymi. Jego zawartość jest następująca:
W serwisie utworzyłem statyczną listę obiektów UserDTO aby w najprostszy sposób zrobić przechowywanie obiektów po stronie serwera. Oczywiście w praktyce tak nie robimy :). Utworzyłem metody do zapisywania, usuwania, pobierania danych pojedynczego obiektu UserDTO, które wykorzystywane są przez kontroler do obsługi requestów. Funkcja getRoles() zwraca nam zawartość naszego dynamicznego combo. W praktyce byłoby tu prawdopodobnie pobieranie listy z bazy danych.
W tym momencie możemy uruchomić aplikację, wywołać adres:
i w przeglądarce zobaczymy:
[{"id":1,"name":"Administrator"},{"id":2,"name":"Obsługa klienta"},{"id":3,"name":"Dyrektor"}]
czyli serializowaną listę obiektów RoleDTO.
W tym momencie po uruchomieniu aplikacji linkiem:
http://localhost:8080/springAjax/springAjax.mvc?showUsers
otrzymamy przycisk "Dodaj Użytkownika" po wciśnięciu którego otworzy się okienko dialogowe z combo wypełnionym przez request ajax'owy:
Umiemy już odebrać dane ajax'em, pora zatem na wysłanie danych do serwera.
Przytoczę tutaj ponownie fragment kodu z pliku springAjax.js, który podpięty jest pod przycisk "Dodaj":
Na początku formularz "userForm" musi zostać serializowany do postaci Javascript'owej. Właśnie do tego wymagany jest dodatkowy plugin serializeForm.js który dołączaliśmy do naszego pliku jsp.
Do wysłania requestu wykorzystujemy funkcję $.ajax z JQuery, w której określamy typ requestu (POST), url (springAjax.mvc), dataType (json), contentType (application/json) oraz przesłyłane dane - i tutaj musimy zamienić Javascript'ową strukturę danych do formatu JSON. Wykorzystujemy do tego funkcję JSON.stringify. W większości nowych przeglądarek ta funkcja jest wbudowana do silnika JavaScript. Dla starszych przeglądarek potrzebowalibyśmy dodatkowej biblioteki którą można znaleźć pod adresem http://www.json.org/js.html. Określamy oczywiście funkcje które mają zostać wywołane w przypadku sukcesu (zamknięcie okienka dialogowego oraz odświeżenie tabelki z listą osób) i w przypadku błędu (alert). Zwróćcie uwagę na jedną ważną rzecz. O ile w przypadku requestów typu GET podawaliśmy parametr, który określał metodę jaka zostanie wywołana, w przypadku requestu POST nie możemy wprost w URL'u zdefiniować tej wartości. Można poradzić sobie z tym na kilka sposobów. Najprostszy zastosowałem w tym przykładzie - w kontrolerze jest tylko jedna metoda typu POST, więc SpringMVC nie ma problemu z wywołaniem odpowiedniego kodu.
Można również zastosować ukryty parametr w formularzu, ale jest to trochę problematyczne, bo w naszym przypadku wystąpiłyby problemy z serializacją takiego formularza. Można również w adnotacji @RequestMapping określić dedykowany URL dla konkretnej metody typu POST i wtedy w URL'u ajaxowego wywołania musielibyśmy zamiast springAjax.mvc wpisać na przykład saveUser.mvc.
Przy tak zdefiniowanej funkcji po wciśnięciu przycisku "Dodaj" zostanie wywołana funkcja kontrolera o nazwie saveUser() która jako jedyna w kontrolerze obsługuje metodę POST. W tym przypadku istotna jest również adnotacja @RequestBody, która określa że na wejściu otrzymamy dane bez nagłówków a dodatkowo dane otrzymane przez metodę zostaną automatycznie zdeserializowane do obiektu typu UserDTO, ponieważ taki parametr przyjmuje metoda. Odbywa się to zupełnie przezroczyście.
W podanym przykładzie zdefiniowałem dodatkowo możliwość kasowania rekordów (metoda deleteUser()), edycji rekordów (fetchSingleUser() w połączeniu z omówioną chwilę wcześniej metodą saveUser()), oraz loadTable(), która zwraca wszystkie rekordy z których następnie budowana jest tabelka HTML. Wszystkie te metody działają na dokładnie takich samych zasadach jak opisane powyżej requesty, więc nie będę zagłębiał się już w ich szczegóły.
Dokładnie z działaniem aplikacji możecie zapoznać się uruchamiając przykład (na końcu znajdziecie link zarówno do gotowego war'a którego wystarczy wgrać do katalogu webapps Tomcat'a) , jak i przeglądając kompletny projekt, który po rozpakowaniu można zbudować poleceniem mvn install. Na potrzeby Tomcata do pom.xml dodana została zależność od biblioteki jstl której wymaga SpringMVC a Tomcat jej nie zawiera.
Zdaję sobie sprawę że miejscami opis jest zbyt szczegółowy a przykład jest dość oczywisty, ale założyłem że warto opisać to dość dokładnie chociażby dlatego że nie każdy na co dzień korzysta ze Spring MVC i nie każdy miał z nim jakąkolwiek styczność. Chciałem zatem zacząć od zupełnych podstaw tak aby każdy był w stanie w bardzo szybki sposób rozpocząć zabawę z tym na prawdę fajnym frameworkiem.
Generalnie pomimo tego że wpis jest dość długi, to temat został omówiony jedynie częściowo. Nie poruszyłem tutaj chociażby kwestii jakichkolwiek walidacji które mogą odbywać się zarówno po stronie klienta jak i serwera, ale to już temat na odrębny wpis.
Piki do pobrania:
War:
Źródła:
2013-02-27
TechFlash - Gradle
Witam,
w imieniu liderów technicznych, a także prelegentów mam przyjemność poinformować o narodzinach pomysłu zorganizowania spotkania pod kodową i tajemniczą nazwą TechFlash. Pierwsze spotkanie odbyło się w środę, 27 lutego 2013 o godzinie 16:00-18:00.
Formuła:
Spotkanie TechFlash (Zbrojny, dzięki za nazwę) ma formułę mini-warsztatów, gdzie część prezentacyjna stanowi jedynie 5-10% całości spotkania, a pozostała część służy praktycznemu poznaniu technologii. Warto więc przynosić na spotkania swojego laptopa. Spotkanie ma luźną formułę, gdzie dyskusje i wymiana doświadczeń są mile widziane i pożądane. To także miejsce dla osób chcących jedynie biernie posłuchać tego, co ma do powiedzenia prelegent.
Miejsce:
Siedziba Decerto,
Postępu 15 B,
sala konferencyjna
Wrażenia:
Przybyły ~23 osoby, a spotkanie zamiast 18 skończyło się przed 20! W załącznikach znajdziecie zdjęcia: tuż przed rozpoczęciem spotkania, w trakcie trwania wykładu Nakula oraz na kilkanaście minut przed zakończeniem spotkania. Poniżej możecie także obejrzyć minutowy filmik będący wycinkiem prezentacji Nakula. Na filmie są twarde dowody, że problem zbyt małego biura nie istnieje, bo uwieczniono 21 developerów w sali ~2,5x5m z pełnym wyposażeniem stanowiska pracy (krzesło, kolana, laptop, zasilacz) :)
Spotkanie było bardzo żywe (czytaj dużo dyskusji), a wiele osób wyraziło pogląd, że takich spotkań powinno być więcej.
Zachęcam więc wszystkich, którzy chcieliby podzielić się swoimi zainteresowaniami technologicznymi do wystąpienia na kolejnym TechFlash!
Wystarczy krótki mail lub rozmowa z Waszym liderem lub ze mną.
A wracając do historycznego już TechFlash szczególne podziękowania należą się:
* Nakulowi - za świetną prezentację oraz czas poświęcony na jej przygotowanie. Świetny pomysł w przykładami, dzięki za poszerzenie horyzontów!
* Kasi - za pomoc w organizacji catering, obsługę ankiet
* Jarkowi vel Kruszyna - po którego pomoc udałem się bez wahania po pierwszej próbie samodzielnego podniesienia stołu :)
* Marcinowi - za wyrwanie z rąk ochrony pizzy i przytarganie tego do firmy
* Tolkowi, Dominikowi, Zbrojnemu i innym - za konstruktywną dyskusję i kontrargumenty
* wszystkim, którzy pomogli przywrócić biuro do stanu sprzed TechFlash :)
Materiały z prezentacji dostępne tutaj
Subskrybuj:
Posty (Atom)