niedziela, 22 grudnia 2013

Otwarcie z mobilizacji + potrawy na święta

Część Artystyczna

Potrawy na święta

Tradycja nakazuje aby przygotować na święta 12 potraw. Z jednej strony ślepa wiara w tradycję strasznie ogłupia jeśli ludzie są odcięci od rodowodu owej tradycji ((W korpo mówi się "Root Cause") ale z drugiej strony jeśli coś ma ogłupiać ludzi niech to będzie tradycja a nie telewizja czy coś takiego.

Poniżej przykładowy stół wilijny statystycznej rodziny polskiej :

Rzeczy które widzimy na zdjęciu to w potocznej mowie suple a w niepotoczne suplementy diety. Suplementy diety nazywają się suplementami ponieważ mają uzupełniać dietę a nie ją zastępować. Jest to ważne gdyż najczęstsza reakcja jaką spotkałem w odpowiedzi na ten temat to połączenie niezrozumienia, negacji i chyba lekkiego przerażenia przed nieznanym.

Wokalizacja owej reakcji zazwyczaj przybiera słowa "nie będę jeść chemii" albo "Jem tylko naturalne rzeczy". Problem polega na zbyt abstrakcyjnym myśleniu - tak, to co może pomóc w programowaniu tutaj akurat działa na naszą niekorzyść. Widzimy ogórek i myślimy ogórek, widzimy pomidor myślimy pomidor...

Chemiczny poziom abstrakcji niżej

Oto kolekcja ciekawych linków :

A żeby na koniec było bardziej intelektualnie to wzmianka o tym jak ołów redukuje IQ

To była wzmianka o chemii tam gdzie standardowy konsument widzi "naturalne produkty żywnościowe". A czy obok złej chemii jest więcej tej dobrej? Niestety nasz przemysł nie wydziela odpadów w postaci witaminy C. Poniżej tabelka żywcem skopiowana z tego artykułu. Procentowa zmiana minerałów i witamin w glebie pomiędzy rokiem 1940 a 1991

MINERALS
VEGETABLE
FRUIT
Sodium
-49%
-29%
Potassium
-16%
-19%
Magnesium
-24%
-16%
Calcium
-46%
-16%
Iron
-27%
-24%
Copper
-76%
-20%
Zinc
-59%
-27%

I Jeszcze na dobicie - link

Świadoma grupa konsumentów

Suplementacja witaminami i minerałami to konieczność. Do tego każdy kto nie pochłania odpowiednich porcji łososia powinien wrzucić do diety Omega3 (a no i podobno łosoś poza Omega3 ma jeszcze trochę rtęci). Jest dużo produktów w aptekach - ja jednak polecam profesjonalne sklepy z suplami dla pakerów. Otóż jeśli sobie zerkniecie na fora zamieszkałe przez ludzi o powierzchni pola większej niż szafa dwudrzwiowa to zauważycie, że niektórzy z nich podchodzą do swojego hobby z ogromną pasją. Na porządku dziennym są posty gdzie jeden czy drugi schab rozbijają dany produkt na czynniki pierwsze i dyskutują pochodzenie każdego ze składników.

To jest właśnie świadoma grupa konsumencka. Tutaj gdy tylko pojawia się jakiś producent, który wali w ch** to od razu jest demaskowany. W przypadku zwykłej żywności są tam jakieś grupy dyskutujące pochodzenie produktów ale chyba większość ludzi po prostu wali do hipermarketu aby kupić coś taniej. A tam to już działa zwykła logistyka - produkt będzie leżał jakiś czas toteż dorzuca się kolekcje "E" aby leżał wystarczająco długo by przynieść zysk a nie stratę. Ludzie kupują to interes się kręci.

I na zakończenie - to co tutaj napisałem ma charakter niefachowego przeglądu literatury fachowej. Zapewne jakiś profesjonalny technolog żywności opisałby to jakoś składniej i dokładniej. To co mogę doradzić od siebie - to mięso z Grota bo tam działa wizja marketingowa "zdrowej" zamiast "taniej". No i tam też gadałem z ekspedientkami i generalnie to czego nie były w stanie namierzyć bez większej ilości konserwantów to chrzan - bo to podobno w naturalnej formie psuje się po dwóch dniach. Jajka to wiadomo - omijać klasę 3 bo to jest prosto z tych farm kurzych gdzie napieprzają w te ptaki antybiotykami z karabinu maszynowego. Ryby kupować jak najmniejsze bo jest szansa, że nawpieprzały się najmniej chemikaliów - no i omijać pangę. Do tego zróbcie sobie eksperyment i zerknijcie latem na rzodkiewki w warzywniakach. Jeśli są wielkości jabłka to jak dla mnie znak, że w danym sklepie pestycydy i inne wynalazki są na porządku dziennym.

I tak poza tym to wesołych świąt.

niedziela, 15 grudnia 2013

CodeRetreat 2013 - Uwagi i wnioski

Frekwencja i alkowigilie

W tym roku zjawiło się mniej ludzi niż poprzednio. Być może jest to spowodowane bliskością Świat i faktem, że firmy organizują swoje Wigilie na których ludzie dzielą się wódko-opłatkiem. Nie jest to w zasadzie żadna przeszkoda bo w sobotę wpadło się kilka osób, które na pewno nie byłyby w stanie prowadzić samochodu. Także pierwsze lesson learn : na kacu też da radę (jest to ważne bo w przyszłym roku pewnie też CR odbędzie w sobotę).

Języki

Chociaż najwięcej było Javy to jednak pojawia się coraz więcej innych: głównie Javascript i Python. Pomału czasy żartów z Javascriptu odchodzą w przeszłość a zaczynają się czasy żartów z ludzi, którzy myślą, że Javascript jest tylko do obsługi onlicków. Był też C++ ale mój mózg odmawia interpretacji tego języka dlatego zazwyczaj patrzyłem się 5 sekund w ekran, pytałem czy jest jakiś dylemat, który mogą pomóc rozwiązać i zazwyczaj przechodziłem dalej.

Object Calisthenics to za mało

Object calisthenics to zestaw ciekawych ćwiczeń-ograniczeń, które wykorzystujemy co roku aby ćwiczyć dobre praktyki obiektowe. No właśnie - obiektowe. Biorąc pod uwagę kierunek w jakim rozwija się Java i inne języki na JVM warto by zrozumieć co tak naprawdę stoi za tymi ćwiczeniami i dlaczego niektóre mogą pomału tracić sens.

Weźmy taki ograniczenie - "one dot per line. W tym przypadku ćwiczenie polega na tym aby nauczyć się lepiej zamykać obiekty i nie wyciągać na zewnątrz ich bebechów. Czyli nie pisać czegoś takiego :

gra.getPlansza().getStrukturaKomorek()
Ale konstrukcja poniżej ma zupełnie inny charakter :
komorki.map(transformuj).filter(tylkoZywe)
Dwa kawałki kodu o zupełnie innym charakterze, o kompletnie innej naturze. Drugi dobry ale pierwszy bardzo niedobry, bardzo bardzo zły.

Może za rok ktoś wymyśli nowy zestaw ograniczeń z ukłonem w kierunku nowych mechanizmów Javy 8? "tylko funkcje jednoparametrowe" albo "wszystko jest funkcją" ?

Ciekawe rozwiązanie

Przy okazji dyskusji and kodem Javascryptowym pojawiło się ciekawe rozwiązanie odnośnie tego jak przygotować aplikację na rozbudowę w kierunku nowych typów komórek.

Prędzej czy później każdy dochodził do reprezentacji otoczenia komórki jak czegoś ala "Sąsiedztwo". Później komórka lub coś innego (w zależności od tego gdzie jest logika transformacji) uzyskuje z Sąsiedztwa informacji o ilości żywych sąsiadów i popycha ewolucję do przodu.

Można też inaczej. Każda nowa komórka może sama dostarczyć algorytm przeżycia a Sąsiedztwo zamieni się w funkcję wyższego rzędu, która ów przepis zmaterializuje. OT coś takiego :

abstract class Cell
case class DeadCell extends Cell{
 //...
}

case class LiveCell extends Cell{
 val lifeCellEvolutionRules:(Int=>Cell)=(liveNeighbours:Int)=> {
   if(Set(2,3).contains(liveNeighbours)) LiveCell()
   else DeadCell()
  }

 def evolve(environment:(Int=>Cell)=>Cell)=environment(lifeCellEvolutionRules)
}

object Game{
 def environmentPrototype(liveNeighbours:Int)(evolutionRules:(Int=>Cell))=evolutionRules(liveNeighbours)
 
 val cell=LiveCell()
 val environment=environmentPrototype(2)_
    cell.evolve(environment)                        //> res1 = LiveCell()
}

Teraz jak dodamy sobie np. komórkę "Zombie" to może ona łatwo sama dostarczyć zasady swojej ewolucji. Uważny czytelnik zauważy, że i tak może być dupa bo nie da się łatwo rozszerzyć starych zasad o nowe typy komórek. Otóż można to łatwo rozwiązać przenosząc zasady ewolucji do odpowiedniego komponentu, który będzie również odpowiednio rozszerzany przez nowy moduł.

trait EvolutionRulesKeeper{
 def evolutionRulesFor(cell:Cell): EnvironmentData=>Cell
}

class BasicEvolutionRules extends EvolutionRulesKeeper{
 protected val rulesForLiveCell=(environmentData:EnvironmentData)=>...
 protected val rulesForDeadCell=(environmentData:EnvironmentData)=>...
 protected val evolutionRules:Map[Cell,EnvironmentData=>Cell]=Map(LiveCell()->rulesForLiveCell,DeadCell()->rulesForDeadCell)
 def evolutionRulesFor(cell:Cell)=evolutionRules(cell)
}

Foty

link do fotek

Wypalenie zawodowe

Ale jeszcze nie moje. Po imprezie była posiadówka w trakcie której jeden kolega opowiadał o szkoleniu gdzie dowiedział się jak rozpoznać nadchodzące wypalenie zawodowe. Podobno najpierw zapierdala się biorąc na siebie coraz więcej i więcej obowiązków aż nagle człowiek pęka. W Holandii podobno jest specjalny typ urlopu, który można wziąć raz w życiu z powodu wypalenia zawodowego. Ja kiedyś zrobiłem sobie trzy miesiące wakacji aby ponownie odnaleźć sens w IT po ponad 2,5 roku pracy w fabryceIT przy cybertaśmie. I jak się okazuje u nas w Polsce jak się zrobi sobie taki urlop to na wszystkich rozmowach kwalifikacyjnych ludzie są zafascynowani tym faktem ;) (niektórzy nazywali to "dziurą w życiorysie zawodowym")

*      *      *

niedziela, 8 grudnia 2013

CodeRetreat 2013 Łódź i wartości edukacyjne

Co gdzie i kiedy

Jeden obraz wart tysiąc słów.

Razem z dwoma innymi prowadzącymi będziemy pomagać każdemu przejść przez ćwiczenia tak aby nauki było jak najwięcej. A jeśli jesteś drogi czytelniku nadal niepewny - poniżej postaram się w tych kilku akapitach zachęcić cię do udziału.

Teoria stojąca za praktyką

To jest prosta a zarazem skuteczna seria ćwiczeń. Wybieramy sobie kilka ograniczeń (np. żadnych ifów) i w trakcie 45 minut staramy się zaimplementować część wybranego problemu z uwzględnieniem tychże ograniczeń. Zazwyczaj w tym miejscu przychodzi czas na jakąś metafarę ze świata karate ale chyba znalazłem coś lepszego - ale to za chwilę.

Jak tak wspominam sobie zeszłoroczne coderetreat i rozmowy wokół tego tematu to oczy me widzą dwa ważne pojęcia, które wydają się być czasem nie do końca zrozumiałe :

  • Proces jest ważniejszy od rezultatu
  • Ograniczenia mają uczyć a nie pomagać

Omówimy je oczywiście w odwrotnej kolejności

Istota treningu

Często ćwiczenia coderetreat porównuje się do ćwiczeń sportowców. Czy to do piłkarza, który godzinami ćwiczy rzuty wolne (nie wiem czy polscy piłkarze ćwiczą godzinami rzuty wolne) czy też skoczka, który godzinami skacze ćwicząc technikę skoku. Można też porównać to do filmu kung fu gdzie młody koleżka spotyka starego dziada, który to okazuje się być mistrzem sztuka walki. Dziadu każe mu walczyć z zasłoniętymi oczyma i młody uczy się wykorzystywać inne zmysły.

Jest być może ciekawsza metafora dla niektórych fanów komputera.

Znałem swego czasu kilku ludzi, którzy bardzo lubili grać w starcrafta. Wchodzili sobie tam online i grali takie nerdowe "mecze". Kosili te kryształy, budowali wojsko i była bijatyka. Wojsko jednostek miało kilka rodzajów i trzeba go było odpowiednio używać w zależności od sytuacji. No i słyszałem takie oto anegdoty, iż ludzie ci spotykali się w kawiarenkach internetowych (tak tak, kiedyś internet był w kawiarenkach) i np. umawiali się, że grają tylko żołnierzykami. Albo, że teraz grają tylko stateczkami latającymi. Po co? Otóż w trakcie normalnej gry i wojennej zawieruchy nigdy nie wiadomo kiedy pojawi się szansa zaatakowania bazy przeciwnika a ty masz tam obok pod ręką trzech żołnierzyków. Czy coś w tym stylu.

Podobne prawa działają na coderetreat. Mamy np. ograniczenie Klasy tylko typu "immutable". Nie oznacza to, że pisanie klasy "Immutable" (żaden słownik nie zwraca mi słowa "niemutowalne" jako poprawnego) są zawsze i wszędzie absolutnie najlepsze. Ćwiczymy po prostu umiejętność pisania klas, które nie mogą mieć żadnych seterów ani innych metod zmieniających stan - czyli witaj łatwiejsza wielowątkowościo i żegnajcie dziwne błędy.

Albo ograniczenie dwa pola na klasę - znowu można łatwo znaleźć ot choćby jeden przykład gdzie to jest niedoskonałe ale stawiając sobie to ograniczenie ćwiczymy pisanie bardziej skonkretyzowanych klas (czyli takich leżących na przeciwnym biegunie niż coś ala *Manager" czy "*Helper" czy inne gówna)

Refleksja procesu

Zacznijmy od dwóch okładek bardzo ciekawych książek :

Każda z nich opisuje "talent" czy "uzdolnienie" (ba - nawet geniusz) jako wynik pewnego procesu a nie wartość wrodzoną danej jednostki. Stoi to w pewnej sprzeczności z tym je**anym ku*wa w du*e popularnym dziś poglądem jakoby ludzkość byłą mieszanką nielicznych liderów otoczonych szarymi masami.

A prawda jest taka, że od najmłodszych lat patologiczny system szkolnictwa a później idiotyczny systemy motywacyjne a korporacjach zabijają w ludziach naturalną pasję tworząc legiony uciekinierów mentalnych szukających azylu w grach komputerowych,serialach TV czy innych używkach. Nie musi tak być.

To jest szalenie złożony proces ale tutaj napiszmy, że aby odnieść wartości z nauki, złapać taki "cug pasji" i poczuć jak nasza wiedza,umiejętności a nawet tożsamość ewoluują - musimy się skupić nie tylko na rezultatach ale i na procesie dochodzenia do nich. To jest znowu mało popularne w świecie Zachodu gdzie "liczą się rezultaty" a na przykład Wschodnia medytacja chyba dopiero wtedy zdobyła pewną popularność gdy zdobyła taką otoczkę "techniki" zwiększenia swojego "performensu"

To jest fajnie opisane w "The talent code". Otóż poza neuronami czy komórkami glejowymi jest jeszcze jedna ciekawa substancja. Mowa o Otoczce Mielinowej, która przyśpiesza połączenia pomiędzy neuronami. Zasada działania jest chyba podobna do akceleratorów cząstek gdzie pole magnetyczne przyśpiesza owe cząstki w odpowiednich tunelach. Wierząc autorowi na słowo - aby zbudować efektywniejsze połączenia nerwowe niezbędna jest autorefleksja nad tym co robimy. Trudno o to w standardowym środowisku pracy gdzie w dobie agresywnych dedlajnów nadszedł "czas napierdalania".

Na koniec

Toteż każdego zachęcam do wzięcia udziału. Na chwilę obecna zostało 14 miejsc.

*      *      *

niedziela, 1 grudnia 2013

Wzorzec Stan w inny sposób

Był swego czasu taki kabareciarz, zwący się Stan Tutaj ale to nie ma żadnego związku z tym artykułem gdyż ja chcę opisać wzorzec Stan tutaj.

Stan

Na necie ilustrację dla tego wzorcu stanowi przykład z włącznikiem światła, który jest totalnie nieludzki tak jak dzisiejsze czasy. Lepszym pomysłem jest wykorzystanie stanu pięknego związku uczuciowego łączącego dwie istoty ludzkie (zazwyczaj o odmiennej płci ale nie wnikam). Dla uproszczenia ograniczymy się do tych dwóch :
  • Kocha
  • Nie Kocha
A zapomnimy o tych stanach :
  • To skomplikowane
  • Graliśmy w słoneczku ale jeszcze ze sobą nie chodzimy

Kod

W obiektówce tworzyło się obiekt, który opakowywał dostęp do stanu i takie tam. Czyli tutaj mielibyśmy coś co symbolizuje związek (miłosny nie Radziecki) i zmiany jego stanu. Ale można też inaczej - zaimplementujmy zmianę stanu... bez zmiany stanu.
def kocha(licznikLudowy:Int):String= if(licznikLudowy==0) "Kocha" else nieKocha(licznikLudowy-1)
def nieKocha(licznikLudowy:Int):String=if(licznikLudowy==0) "Nie Kocha" else kocha(licznikLudowy-1)

kocha(10)                                       //> res0: String = Kocha
kocha(11)                                       //> res1: String = Nie Kocha
Niby fajnie ale teraz się wywali :
 kocha(100000)                                   //> java.lang.StackOverflowErrorSexuNieBedzie

Niestety nie starczyło miejsca na stosie na tyle wywołań tychże dwóch funkcji (stos w informatyce to miejsce gdzie pali się czarownice).

Trampolina

Internet zna rozwiązania tego problemu z zastosowaniem techniki zwanej trampoliną (albo czymś co się wymawia podobnie ale znaczy coś zupełnie innego). Idea jest taka aby ograniczyć skoki do kilku komórek na stosie - czyli takie "Tail recursion" dla kilku funkcji na raz.
def kocha(licznikLudowy:Int):TailRec[String]= if(licznikLudowy==0) done("Kocha") else tailcall(nieKocha(licznikLudowy-1))
def nieKocha(licznikLudowy:Int):TailRec[String]=if(licznikLudowy==0) done("Nie Kocha") else tailcall(kocha(licznikLudowy-1))

kocha(100000).result                            //> res0: String = Kocha

Typ zwracany to już nie jest zwykły string ale String opakowany w TailRec. No i metody wywołujemy poprzez done i tailcall. Będę musiał kiedyś doczytać jak pogrubia się tekst w tej kolrowaczce do kodu.
*      *      *