WarszTaty z Ojcostwa

W ostatni weekend miałem okazję wziąć udział w warsztatach skupionych dookoła tematu ojcostwa. Spotkanie pt. Bliżej – pełna łączność było organizowane przez tato.net, największą tego typu organizację w Polsce i prawdopodobnie w Europie Środkowo-Wschodniej. Jeśli nie masz ochoty na czytanie całego postu – już teraz mogę powiedzieć, że polecę je każdemu ojcu jakiego znam i żałuję, że nie namówiłem nikogo przed rozpoczęciem eventu.

Dlaczego wziąłem udział w warsztatach?

Jeszcze 1.5 roku temu, gdy moje pierwsze dziecko nie było dla nas, rodziców żadnym wyzwaniem często poruszaliśmy temat edukacji domowej. Chyba nawet zaczęliśmy deklarować znajomym i rodzinie, że taka przyszłość czeka nasze dzieci. Dziś jednak trochę trudniej mi to sobie wyobrazić. Pierwsze kłopoty i frustracje związane z wychowywaniem odzierają nas trochę z ideałów i mówią – możecie nie dać rady.

Zauważyłem tę zmianę w sobie oraz doszedłem do wniosku, że będzie jeszcze trudniej. Dlatego nie wahałem się ani chwili, gdy ktoś ze znajomych na facebooku polecił warsztaty – muszę się przygotować na sztormy, które nas czekają.

sopot2

Dlaczego Ty powinieneś wziąć udział w tych warsztatach?

Mimo, że ojcostwo nie ma dobrego PRu – nie jest za głośno o odpowiednikach Billa Gatesa czy Elona Muska ze świata ojcostwa, to rola taty jest nieoceniona w życiu każdego dziecka. Często niedoceniana, czasem uważana jako zajęcie dodatkowe obok pracy, ale ważna. Widać to szczególnie, gdy się tę rolę spieprzy.

Ale jeśli doskonale zdajesz sobie sprawę z tego, że ojcostwo jest ważne to warsztaty przede wszystkim pozwalają Ci porozmawiać na temat bycia tatą w szerszym gronie ojców. Posłuchać ich doświadczeń i o trudnościach z jakimi się mierzą. Dowiedzieć się czym zaskakują ich dzieci i jakie błędy popełnili. Jest tego masa. Dyskusje odbywają się na znacznie głębszym poziomie niż te, które odbywasz w czasie przerwy w pracy.

Mnie najbardziej uderzyło, że całe 9 godzin rozmawialiśmy i wykonywaliśmy ćwiczenia z obszaru, którym zajmujemy się intensywnie potem przez co najmniej 20 lat. Tak jak zdobywasz wiedzę techniczną, czy domenową, tak samo warto zainwestować trochę czasu w dowiedzenie się jak możesz być lepszym rodzicem.

I jeszcze jedno porównanie. W świecie motocyklowym mawia się, że jedna godzina spędzona na torze motocyklowym może dać Ci więcej niż kilka tysięcy przejechanych kilometrów. Na warsztatach jest dokładnie tak samo.

Czym warsztaty nie są

Warsztaty nie są terapią grupową lub szkoleniem. Nie są też naprawą, dla niektórych są takim przeglądem, który co roku robimy naszym samochodom. Jest to spotkanie, gdzie każdy próbuje wyciągnąć najwięcej dla siebie i wrócić do domu z wizją (tato-planem), który mu pomoże być lepszym ojcem.

Warsztaty też nie są wykładem, który mówi jakie ojcostwo powinno być, a jakie nie. To raczej zbiór wskazówek. Nikt nikogo nie ocenia na forum i wszyscy na samym początku zaproponowaliśmy kodeks, którego później przestrzegaliśmy.

Miałem to szczęście, że byłem na spotkaniu najmłodszym ojcem, więc wiele rzeczy, które usłyszałem były dla mnie zaskakujące i jednocześnie pouczające, gdyż mój wyidealizowany obraz ojcostwa dopiero od niedawna jest zaburzany przez moje dzieci;-)IMG_20180519_085528

Przebieg spotkania

Pierwsza część warsztatów miała pomóc grupie poznać się nawzajem, dodać trochę kontekstu do wypowiedzi każdego z nich. Następnie każdy miał się ocenić jako ojciec za pomocą krótkiego psychotestu. Później ćwiczeniami, rozmowami i krótkimi prezentacjami przechodziliśmy przez kolejne filary ojcostwa. Dokładniejszy plan spotkania jest dostępny na stronie . Ja byłem bardzo pozytywnie zaskoczony spotkaniem, dlatego nie będę go opisywał w szczegółach. Zachęcam – notujcie wartościowe myśli, później warto będzie do nich wrócić, a pamięć jak wiadomo jest ulotna.

Na spotkaniu można było zapoznać się z wybraną literaturą, dostępną również na stronie tato.net. Dowiedziałem się o istnieniu i kupiłem w dobrej cenie grę pt. Pytaki. Jej recenzja na pewno się tu pojawi.

Dzięki współfinansowaniu warsztatu przez Szkołę Montessori Latawiec z Sopotu na warsztatach był poczęstunek, kawa, ciasto i obiad. Nawet bilety były o połowę tańsze. Z całego serca dziękuję tej placówce, bo gdyby nie oni, nie dowiedziałbym się o takich spotkaniach!

Advertisements

Powiśle, Mazury i Warmia na dwóch kołach

For english version – TIY – translate it yourself.

Jestem posiadaczem Junaka 125 RS Pro – małego, miejskiego motocykla. Od zawsze marzyła mi się jakaś większa wyprawa. Jako, że jestem człowiekiem ostrożnym to nie kupiłem dużego turystyka i nie ruszyłem od razu w Alpy, tylko sprawdziłem na jednodniowej wycieczce, czy to w ogóle zajęcie dla mnie.

Ostatniego dnia czerwca wypożyczyłem w www.wypozyczalniamotocykli.com żółte BMW R1200 GS. Tydzień przed wycieczką codziennie zastanawiałem się jak uniknąć nieprzyjemnych zdarzeń na drodze, czytałem o pokonywaniu zakrętów, obejrzałem 2 razy film pt. “Bibila pokonywania zakrętów“. Noc przed wyjazdem, gdy już odebrałem maszynę, nie mogłem spać – chyba ze strachu.

19897476_1581429205222492_37249854_o

Wycieczka

Wycieczkę zaczęliśmy o 6:40. Wygramoliłem (GS – 240 kg, Junak – 135 kg) motocykl z parkingu podziemnego i w otoczeniu lekkiej mżawki wyruszyliśmy z żoną w kierunku Kwidzyna. Nie pojechaliśmy autostradą, a przez Tczew i Malbork. Spoczywała na mnie spora odpowiedzialność, aby bezpiecznie przewieźć dwójkę młodych rodziców na motocyklu, którego nie znałem, więc jechałem tempem 90-105 km/h. Trasa Malbork-Kwidzyn jest naprawdę urokliwa. Przed centrum miasta skręciliśmy do Prabut, aby tam około 8:00 zjeść śniadanie na stacji benzynowej.

Nie opiszę całej trasy, ale tylko niektóre jej części. Podgląd pełnej, 11 godzinnej wycieczki z dłuższymi postojami w Prabutach, Szczytnie i Lidzbarku Wamińskim tutaj:

Uroki trasy

Polska jest naprawdę urokliwa. Byłem bardzo skupiony na jeździe, ale czasem zerknąłem tu i tam i uważam, że nie doceniałem do tej pory piękna polskich krain. Lasy z wplecionymi jeziorami, wzniesieniami, poprzecinane tym co motocykliści lubią najbardziej, czyli zakrętami;-) Pachnące pola miesiąc przed żniwami – naprawdę, atmosfera była fantastyczna. Pogoda do samego Lidzbarka dopisała, chociaż widzieliśmy, że się zmienia, bo bardzo często obrywaliśmy silnymi podmuchami wiatru. Trasa Olsztynek-Szczytno – rewelacja. Niezatłoczona, świetna nawierzchnia nic tylko jechać.

szczytno13

Niestety zdarzyło się kilku kierowców, którzy są kiepscy w drogowej komunikacji. Na szczęście popsuli tylko nerwy i tylko na chwilę swoim ostrym hamowaniem i sygnalizowaniem zamiaru skrętu w momencie skrętu. Tak jak początkowo jeździłem 20 metrów za samochodami, tak po 100 km stwierdziłem, że 30-35 metrów będzie jeszcze bardziej bezpieczne.

Nie spotkało nas żadne zdarzenie nagłe, starałem się ich w skupieniu wypatrywać, czy to psa, jelenia, czy wiewiórki. Hamowanie awaryjne było jedno i GS zaskoczył wzorową przyczepnością. W mieście takim motocyklem nie jeździ się wygodnie, ale to pewnie kwestia moich przyzwyczajeń i umiejętności. Płynne przejechanie ronda to na takiej maszynie z plecaczkiem nie lada wyzwanie.

Niemiłe (nie)zaskoczenie na koniec

Wracaliśmy z Lidzbarka w ciągłym, ale nieobfitym deszczu – zarówno ja, plecaczek, jak i motocykl daliśmy radę, o 17:30 już zdejmowaliśmy mokre ciuchy w naszym mieszkaniu. Na trasie przepuszczaliśmy osobówki, które za wszelką cenę musiały jechać 110 km/h, a my na zakrętach z powodu kiepskich warunków trzymaliśmy się prędkości ze znaków (50) (70). Cóż – mam nadzieję, że niektórzy kierowcy nauczą się, że trzymanie się 5 metrów za pojazdem nie jest do końca bezpieczne. Nie mogę uwierzyć jak często zdarza mi się to na lewym pasie na autostradzie jak i w trasie w Polsce. Oby Ci którzy muszą się tego nauczyć nie zapłacili wiele za takie lekcje.

lidzbark39

Podsumowanie

Podobną trasę serdecznie polecam. Mimo, że to był tylko jeden dzień – niecałe 550 km to byliśmy bardzo zmęczeni i obolali na koniec. Mieliśmy pełen pogodowy przekrój. Nie rozstrzygnąłem jeszcze, czy kiedyś wybiorę się na rumuńską Transalpinę, ale w Bieszczady pewnie spróbuję. Tym, którzy nie chcą kupować wielkiego motocykla, i nie mają czasu na więcej niż 3 wyprawy w roku polecam Pomorską Wypożyczalnię Motocykli. Ja na pewno jeszcze skorzystam z ich usług, oby jeszcze w tym roku;-)

#6 Abstraction power in genetic algorithms

In this post I will explain the implementation of GA for buying motorocycle from the previous post as well as I will show a good practice – creating abstraction layers.

Code – GA part

In the code, which is available here you can see package ‘ag’ containing 2 classes and one interface:

  • Phenotype:
public class Phenotype implements Comparable<Phenotype> {
  int gene;
  int value;

  // TODO - should be configurable
  static MapableToGene geneToIndividualMapper = new Moto();
...
  public void crossover(Phenotype p, int k) {
    int geneA = gene;
    int geneB = p.gene;
    int maskA = ~(~0 << k); // i.e. if k = 2 then maskA = 000011, but on 32 bits
    int maskB = (~0 << k); //                then maskB = 111100, but on 32 bits
    gene = (geneA & maskA) + (geneB & maskB);
    p.gene = (geneB & maskA) + (geneA & maskB);

    calculateValue();
    p.calculateValue();
  }

  private void calculateValue() {
    geneToIndividualMapper.mapFromGene(gene);
    value = geneToIndividualMapper.value();
  }
}
  • Population:
public class Population { // should be generic
  List<Phenotype> population;
  List<Phenotype> nextGeneration;
  MapableToGene mapableToGene;

  // Temporary constants TODO: Should be configurable
  final int populationSize = 20; // == 7*6 / 2
  final int counterMax = 5;
...
}
  • MapableToGene:
public interface MapableToGene {
  int mapToGene();
  void mapFromGene(int gene);
  int value();
}

My intention was to write as simple as possible code – there are still some TODO marks there. Once I improve the code I will update the post as well.

As you may already see – MapableToGene interface is our bridge between concrete Moto class and abstract Phenotype (or individual in GA terminology). Phenotype doesn’t know about the problem it is used for, except the moment when we try to value concrete set of genes.

Code – concrete optimization problem

When we create a class implementing MapbleToGene interface it is really easy to use this GA implementation. We need to define 3 methods, in Moto class they look like this:


public class Moto implements MapableToGene{
  int power;
  int ccm;
  int price;
  int weight;
  int gasUsage;
  int equipmentQuality;
  boolean canMyWifeUseIt;
  boolean doesMyWifeLikeItsDesign;
...

  @Override
  public int mapToGene() {
    // 8 fields, so every information is normalized into 4 bits
    int gene = power > 100 ? 15 : 15 * power / 100; //max is 100

    gene += (ccm > 1000 ? 15 : 15 * ccm / 1000) << 4; //max is 1000
    gene += (price > 40000 ? 15 : 15 * price / 40000) << 8; //max is 40000
    gene += (weight > 220 ? 15 : 15 * weight / 220) << 12; //max is 220
    gene += (gasUsage > 10 ? 15 : 15 * gasUsage / 10) << 16; //max is 10
    gene += (equipmentQuality > 15 ? 15 : equipmentQuality) << 20; //max is 15

    gene += (canMyWifeUseIt ? 15 : 0)<<24;
    gene += (doesMyWifeLikeItsDesign ? 15 : 0)<<28;

    return gene;
}

  @Override
  public void mapFromGene(int gene) {
    int mask = 15; // 0000....01111 but we use 32bits
    power = (gene & mask) * 100/15;
    ccm = ((gene & mask<<4) >> 4) * 1000/15;
    price = ((gene & mask<<8) >> 8) * 40000/15;
    weight = ((gene & mask<<12) >> 12) * 220/15;
    gasUsage = ((gene & mask<<16) >> 16) * 10/15;
    equipmentQuality = ((gene & mask<<20) >> 20);
    canMyWifeUseIt = ((gene & mask<<24) >> 24) != 0;
    doesMyWifeLikeItsDesign = ((gene & mask<<28) >> 28) != 0;
}
  @Override
  public int value() {
    return power/4 + ccm/10 - price/1000 - weight/10 - gasUsage + equipmentQuality/2 + (canMyWifeUseIt?5:0) + (canMyWifeUseIt?3:0);
  }
}

The idea behind mapToGene() implementation is simple. We try to put all relevant information about motorocycle into 32bit int. As you see, I chose to give every information the same space – 4 bits, which is probably not the best choice (I will show better example shortly). By this mapping we lose some information, but it doesn’t have to be like that. Firstly we can use 64 bit long or array of ints for example. Secondly I didn’t use this space wisely. Boolean fields could be mapped to single bit, and then price, weight and ccm could have more space for themselves.

Implementation of mapFromGene() is reverse process to mapToGene(), and value() is really important function, but in this case really simple.

Code – Another example. Benefits of separation of layers

Let’s create small class PerfectHusband:

public class PerfectHusband implements MapableToGene{

  List<HusbandAttribute> attributes;

  public PerfectHusband(){
    attributes = new ArrayList<>();
    attributes.add(new HusbandAttribute("earnings", 0, 14));
    attributes.add(new HusbandAttribute("iq", 0, 7));
    attributes.add(new HusbandAttribute("emotional intelligence", 0, 7));
    attributes.add(new HusbandAttribute("addictons", 0, 2));
    attributes.add(new HusbandAttribute("attractive", 0, 1));
    attributes.add(new HusbandAttribute("having a motorocycle", 0, 1));
  }

  @Override
  public int mapToGene() {
    int gene = 0;
    int bitsShift = 0;
    for(HusbandAttribute attr : attributes){
      int maxValue = (int)Math.pow(2.0, attr.getnOfBits())-1;
      gene += (attr.getValue() > maxValue ? maxValue : attr.getValue()) << bitsShift;
      bitsShift = attr.getnOfBits();
    }
    return gene;
  }

  @Override
  public void mapFromGene(int gene) {
    int bitsShift = 0;
    for(HusbandAttribute attr : attributes){
      int mask = ((int)Math.pow(2.0, attr.getnOfBits())-1) << bitsShift;       attr.setValue(Math.abs((mask&gene) >> bitsShift));
      bitsShift += attr.getnOfBits();

    }
  }

  @Override
  public int value() {
    int value = 0;

    int earnings = getValueByAttributeName("earnings");
    value += earnings < 1000 ? - 100 : (int)Math.sqrt(earnings);
    value += getValueByAttributeName("iq") - 95;
    value += getValueByAttributeName("emotional intelligence") - 95;
    value -= Math.pow(getValueByAttributeName("addictons") * 2.0, 3);
    value += getValueByAttributeName("attractive") * 30;
    value += getValueByAttributeName("having a motorocycle")*50;
    return value;
}   
  private int getValueByAttributeName(String name){
    return attributes.stream().filter( a -> a.getName().equals(name)).findFirst().get().getValue();
  }
}

As you can see it is different class, different problem we want to solve, but using this separation of concerns between GA layer and concrete layer gives us a solution here as well:

Phenotype [ gene=11001111100111101111000101100101, value=249]

PerfectHusband [attributes=[HA [earnings, 12645], HA [iq, 123],
HA [emotional intelligence, 124], HA [addictons, 0], HA [attractive, 1],
HA [having a motorocycle, 1]]]

You can try this by yourself it should be very easy. You can create PerfectBicycle class, or Event TSP path class, the only thing your class need to do is to map itself from gene (32 bit int), map it to gene, and value itself based on criteria you choose. Good luck!

#5 Buying a motorocycle – how to create rationalization for irrational decisions? Use genetic algorithms!

I am a guy who tries to make rational decisions in life, or at least that’s what I like to think. But in last days I made a few irrational decisions and buying motorocycle is one of them. Here is my first motorocycle:

junak-rs125-pro-2016_4290

I was thinking about buying bike many times in my life. I have had motorocycle license since 2013, but my rational brain always had an excuse for purchasing one. Finally my brother convinced me that it is a rational, good, giving a lot of fun decision.

Why you reading about motorocycles on a software blog?

Read More »

#4 Let’s talk about Data

The biggest challenge so far was finding common traits in different types of data structures. The project goal was to deliver a tool which can handle ETLing SQL query table, CSV, XML, JSON. I was thinking a lot how to connect all the differences in simple class. I will explain why it needs to be done, and what I’ve done so far.

Why common Data type is needed?

ETL job is just a set of transformations/processes following each other. The most Read More »

#3 MVP + Mockup + project value

MVP

Minimum viable product is a product with small number of features, but good enough to be shipped on the market. Market presence gives you early feedback about your idea even if you haven’t invested a lot of money yet. I don’t know much about product management or selling the dream to customers, but I trust that building MVP is one of the best things that increases your chance for success.

Mockup

I am not an artist at all, so please be forgiving. Here is the first mockup in my life, which shows how the first version may look like:

appMockup

Read More »

#2 Online ETL – Project Description

In this post I am going to describe what ETL is about, what kind of features I would like to add to the project and I want to mention one very useful library for all Java developers.

ETL

Extract Trasform and Load – isn’t that what we all programmers do? We extract data from the database or different data sources to model classes, we transform it in some way and finally data is loaded and presented to the user. Of course process is in most cases much more complicated, but there is no way to avoid data in your project.

Does it mean that we should consider using ETL tools for every project? No. It means, that in strongly Data-Driven projects we should at least think about benefits of using such a tool. Let see an example job in ETL:

2388-etldiagram

I hope I explained the basic idea of ETL tool, if you are looking for more see wiki.Read More »