Dropwizard Support for InfluxDB

I’ve created a Dropwizard Metrics reporter for InfluxDB. It supports Dropwizard v0.9.x and InfluxDB v0.8.x. You can build a dashboard using Grafana to view your metrics.

Usage and configuration:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
metrics:
  reporters:
    - type: influxdb
      frequency: 10 seconds
      host: localhost
      port: 8086
      database: web
      username: admin
      password: admin
      skipIdle: false

The source can be found on GitHub.

ESP8266 Wi07-3 SMD adapter

This is my very first PCB board, designed using KiCad. It’s an ESP8266 Wi07-3 adapter which makes it easy to use this ESP8266 on a breadboard.

The board is very minimalistic. In addition to the ESP8266 module, it contains a button and a resistor for flashing firmware.

The schematic and PCB design files can be found on GitHub.

From the web #1

As I’m not able to keep up posting new and interesting finding each and every week, I’m restarting the idea with a different title.

The dwarves of Auschwitz

The story of a family of dwarves in the German Nazi concentration and extermination camp.

SPACE SESSIONS: Songs From a Tin Can

Col. Chris Hadfield releases a music album.

story of .io

The story of the fastest-growing top-level domain on the internet.

Do You Code? You Should Try This Font

A new programming typeface - Monoid.

Links of the week #1

Google I/O 2015 - Engineering for the Stratosphere - Presented by Women Techmakers

In this talk, Google engineers give a glimpse of the challenges involved in developing the Project Loon.

The Erlang Master Classes

The University of Kent created a series of video master classes presented by Joe Armstrong, Francesco Cesarini, and Simon Thompson.

Radiolab

It’s a very entertaining and well-made podcast about curiosity.

This Developer’s Life - 4.0.1 Faith

After many days of waiting another great episode has been published.

Connecting sensors to the cloud

I’ve connected a temperature & humidity sensor, a photoresistor, and a LED to an Ethernet shield plugged onto my Arduino Uno.

Schematic

I’ve used a CoAP library and I’ve created an Arduino sketch. It connects to the internet and sends sensor readings to the cloud.

I may view them in the application or on a dashboard. I can also embed live measurements into an image and show it on any website (as I did with the schematic above).

Dashboard

The schematic and code can be found on GitHub.

Arduino: checking memory footprint

I can check the memory footprint using the avr-size command.

1
2
3
% avr-size microcoap.cpp.elf
  text    data    bss    dec    hex filename
     0   18612	    0	 18612	 48b microcoap.cpp.hex

When I enable the avr format (-C) and provide the microcontroller model, the output becomes more descriptive.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
% avr-size -C --mcu=atmega328p microcoap.cpp.elf
AVR Memory Usage
----------------
Device: atmega328p

Program:   18612 bytes (56.8% Full)
(.text + .data + .bootloader)

Data:       2491 bytes (121.6% Full)
(.data + .bss + .noinit)

Nested commands with argparse

Given the following argparse setup:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
def foo_bar():
  print('Foobar')

parser = argparse.ArgumentParser(prog='app')
subparsers = parser.add_subparsers()

foo = subparsers.add_parser('foo')
foo_subparsers = foo.add_subparsers()

bar = foo_subparsers.add_parser('bar')
bar.set_defaults(func=foo_bar)

args = parser.parse_args()
args.func(args)

I can invoke the nested sub-command like this:

1
2
% app foo bar
Foobar

Rejs po Zatoce Gdańskiej

S/Y Kacyk

W terminie 20.09 - 27.09 odbyliśmy rejs na pokładzie S/Y Kacyk. Jacht przeznaczony jest dla pięciu osób ale my pływaliśmy tylko w trzy, przez co mieliśmy całkiem komfortowe warunki jak na niezbyt dużą jednostkę (9,15m).

Gdańsk - Twierdza Wisłoujście

Rejs rozpoczęliśmy i zakończyliśmy w “marinie” przy Twierdzy Wisłoujście. Miejsce to jest na tyle oddalone od Gdańska, że niektórzy taksówkarze i dyspozytorzy mieli problem z jego lokalizacją. Zaplecze “mariny” jest dosyć minimalistyczne, sanitariaty prawie nie istnieją, brak jakiejkolwiek sklepu, w którym możnaby się zaopatrzyć w produkty spożywcze. Nie byliśmy na to przygotowani dlatego zaraz po odebraniu jacht wyruszyliśmy w kierunku Gdyni.

Gdynia

Gdynia

Marina jachtowa jest zlokalizowana bardzo blisko atrakcji turystycznych i centrum. Wszystko dobrze zorganizowane, zaplecze w porządku.

Puck

Puck

Przystań w Pucku jest już chyba całkiem zapomniana a przynajmniej tak wygląda. Bosmana po 16-tej trudno znaleźć a sanitariaty dostępne są tylko w godzinach “urzędowania”. Gdy już rano udało nam się skorzystać z pryszniców, nie było to zbytnio przyjemne doświadczenie. Prysznice uruchamiane są przez psujące się automaty, które przyjmują tylko pojedyncze “złotówki”. Czas działania był bardzo krótki a woda lodowata. Na kei, przy której cumowaliśmy “alongside”, działa tylko jeden punkt z prądem więc żeby się podpiąć trzeba się było dobrze ustawić albo posiadać odpowiednio długi przedłużacz - niestety nie spełniliśmy żadnego z tych warunków dlatego tego wieczora musieliśmy oszczędnie gospodarować energią elektryczną.

Jastarnia

Bardzo przyjemna marina, odnowiona ze środków Unii Europejskiej. Łatwy dostęp do prądu ale trzeba posiadać wąż aby nabrać słodkiej wody. Sanitariaty w porządku, ciepła woda po prysznicem (coś czego bardzo mi brakowało po wizycie w Pucku). Wyjątkowym dziwactwem była specjalna opłata za skorzystanie z WC, połowa ceny za skorzystanie z prysznica. Domyślam się, że przystań wykonuje biznesplan inwestycji unijnej ale w sytuacji gdy opłata za postój nie odbiega od standardowej, dodatkowe “opodatkowanie” korzystania z toalety wydaję się lekką przesadą.

W Jastarni przeczekiwaliśmy ostrzeżenia o sztormie na Bałtyku i wybraliśmy się na wycieczkę busem do Helu. Zdarzyliśmy na karmienie podopiecznych fokarium i wspieliśmy się na latarnię morską.

Władysławowo

Prawdziwie morski port rybacki gdzie przystań jachtowa jest tylko dodatkiem. Od czasu do czasu przypływały kutry i wyładowywały połów.

Marina mała ale całkiem przyjemna, zaplecze w porządku. Popełniliśmy małą gafę próbując dokonać opłaty za port w bosmanacie. Okazało się, że trzeba poczekać na osobę zbierającą takie opłaty.

Hel

Hel

Marina w Helu powstała jako część portu rybackiego. Tutaj jednak nie znaleźliśmy spokoju, zafalowanie wewnątrz portu nie pozwalało w nocy w pełni odpocząć. Niestety znalazł się kolejny absurd - po godzinie 23 toalety są zamykane.

Będąc w Helu udaliśmy się z wizytą do pubu Kapitan Morgan. Ku naszej radości po około pół godziny okazało się, że pojawi się szantyman i będziemy mogli trochę pośpiewać. Śpiewniki były dostępne w barze, szantyman śpiewał i grał utwory na żądanie a większość sali pomagała.

Gdańsk - centrum

Gdańsk

Ładna marina w samym centrum. Warunki postoju są bardzo dobre a bliskość centrum daje możliwość korzystania z atrakcji także w nocy. Jedyny minus to odległość jaką trzeba pokonać Martwą Wisła aby tam dotrzeć. Daje to jednak możliwość zobaczenia zaplecza portu, nabrzeży różnych funkcji czy stoczni remontowej.

Legos for the iPad Generation

Bloomberg:

littleBits Founder Ayah Bdeir discusses her opensource library of electronic modules that snap together with tiny magnets for prototyping and play.

This is awesome.

Never Make Counter-Offers

Bram Cohen:

Management figures they’ll save money on salaries by leaving it up to the employees to negotiate for their own pay. So they don’t give raises until someone tries to negotiate for one.

Why would you want to work at ThoughtWorks

Aaron Erickson:

In many companies, particularly consulting companies, salespeople call the shots, have most of the respect, and take home most of the rewards. Delivery – the “programmers”, are the people who are to be managed, paid as little as possible, and controlled by management.

Konwersja czasu do liczby sekund w Excelu

Aby skonwertować czas do liczby sekund w Excelu należy wartość komórki z czasem przemnożyć przez liczbę sekund w dobie (86400).

Times are stored internally by Excel as fractions of a 24-hour day, so that 12:00:00 would be stored as 0.5 and 18:00:00 as 0.75. Consequently, to convert a time to seconds, you must multiply by the number of seconds in a day - it is easier to remember this as *24*60*60 rather than the actual number (86400).

Weryfikacja na etapie kompilacji nazw właściwości wykorzystywanych w Windows Forms Data Binding

Kontrolki wizualne w technologii Windows Forms pozwalają tworzyć powiązanie pomiędzy właściwością kontrolki a właściwością obiektu będącego źródłem danych dla tej kontrolki.

1
2
3
4
5
6
7
class MyTextBox : TextBox
{
  public void Bind(object obj, string dataMember)
  {
    DataBindings.Add(new Binding("Text", obj, dataMember));
  }
}

Takie rozwiązanie działa bez zarzutu jednak ma pewną wadę – nazwa właściwości źródła danych przekazywana jest jako łańcuch znaków. Powoduje to sytuację, w której poprawność tego powiązania zweryfikujemy dopiero po uruchomieniu programu chociaż chciałoby się aby było to już na etapie kompilacji.

Tworzenie aplikacji Ruby on Rails z użyciem Passenger

Chciałem wykorzystać Phusion Passenger podczas tworzenia aplikacji Ruby on Rails. Konieczne w tym celu było aktywowanie środowiska development. Niestety opcja RailsEnv nie skutkowała pożądanym zachowaniem. Ostatecznie należało ustawić opcję RackEnv (jak w przykładowej konfiguracji zamieszczonej poniżej).

1
2
3
4
5
6
7
8
9
<VirtualHost *:80>
  ServerName app.local
  DocumentRoot "/path/to/your/app/public"
  RackEnv "development"
  <Directory "/path/to/your/app/public">
    Allow from all
    Options -MultiViews
  </Directory>
</VirtualHost>

Maven: Ustawienie wersji JDK dla kompilatora

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<project>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

Tworzenie obiektów klas, które zależą od siebie nawzajem

W systemie istnieją dwie klasy (FooImpl i BarImpl), które zależą od siebie poprzez pole konstruktora.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
interface Foo {
  void execute(boolean forward);
}

class FooImpl implements Foo {
  private final Bar bar;

  public FooImpl(Bar bar) {
    this.bar = bar;
  }

  public void execute(boolean forward) {
    System.out.print("Foo");
    if (forward) {
      System.out.print(" -> ");
      bar.execute(!forward);
    }
  }
}

interface Bar {
  void execute(boolean forward);
}

class BarImpl implements Bar {
  private final Foo foo;

  public BarImpl(Foo foo) {
    this.foo = foo;
  }

  public void execute(boolean forward) {
    System.out.print("Bar");
    if (forward) {
      System.out.print(" -> ");
      foo.execute(!forward);
    }
  }
}

Taki stan nie pozwala stworzyć obiektów tychże klas bez konieczności wprowadzenia dodatkowego obiektu pośredniczącego wywołania do poprawnie stworzonego obiektu. W języku Java funkcjonalność tą realizuje klasa java.lang.reflect.Proxy.

Kontekst w tagach JSP 2.0

W weekend trafiłem na całkiem dobry opis użycia tagów z JSP 2.0. Tagi w tej wersji pozwalają w łatwy i przyjemny sposób upraszczać kod źródłowy widoku.

Próbowałem uruchomić jeden z pierwszych przykładów, operujący na danych zawartych wewnątrz taga:

<jsp:doBody var="theBody" />
<% String bc = (String) pageContext.getAttribute("theBody"); %>
<%= bc.toUpperCase() %>

Niestety próba kompilacji strony używającej taga się nie powiodła.

SEVERE: Servlet.service() for servlet jsp threw exception
org.apache.jasper.JasperException: Unable to compile class for JSP:

An error occurred at line: 3 in the jsp file: /WEB-INF/tags/bar.tag
pageContext cannot be resolved
1: <jsp:doBody var="theBody" scope="page" />
2:
3: <% String theBody = (String) pageContext.getAttribute("theBody"); %>
4: <%= theBody %>

Pierwsze Coding Dojo za nami

Tydzień temu w piątek poprowadziłem pierwsze w moim zespole (ale także w mojej karierze) Coding Dojo, którego tematem było Bowling Kata. Spotkaliśmy się w 4 osoby na ostatnie 2,5h piątkowego popołudnia.

Stanowisko, zorganizowane w sali konferencyjnej, składało się z:

  • laptopa,
  • projektora,
  • zewnętrznej klawiatury i myszki.

Spotkanie miało na celu zapoznanie kolegów z samą ideą Coding Dojo oraz praktyczne wykorzystanie TDD. W związku z faktem, że jesteśmy bardzo początkujący w tym temacie, nie udało nam się osiągnąć głównego zamysłu tego rodzaju spotkań - wykorzystania zasad projektowania obiektowego do rozwiązania postawionego problemu. Mam jednak nadzieję, że w miarę kolejnych spotkań uda nam się ten element układanki poprawić.

Pierwsze wrażenia były bardzo pozytywne w związku z czym spotkania zostaną także zorganizowane dla pozostałych kolegów z mojej jednostki organizacyjnej (2 grupy po 4 osoby). Przeprowadzę z nimi spotkania na ten sam temat, co powinno dać mi nowe doświadczenia na przyszłość.

Wnioski

  • musimy zwracać większą uwagę na sposób rozwiązania problemu, najważniejsza jest jakość rozwiązania a nie jego kompleksowość,

  • po pewnym czasie spotkanie stało się troszkę chaotyczne, każdy kto miał jakiś pomysł tworzył test zaś inna osoba starała się go spełnić; podczas kolejnych spotkań muszę położyć większy nacisk na kolejność oraz długość okienek czasowych,

  • piątkowe popołudnie to nie jest najlepsza pora, zmęczenie po całym tygodniu pracy negatywnie wpływa na wydajność,

  • 2,5h w zupełności nam wystarczyło, będę się jednak zastanawiał nad zmianą długości spotkania (do 2h lub 1,5h) w zależności od tematu spotkania,

  • klawiatura laptopa może być niewygodna, dlatego następnym razem muszę przygotować dwa stanowiska z normalną klawiaturą i myszką.

Domyślne opcje wtyczki jQuery

Funkcja extend rozszerza lub nadpisuje domyślne opcje wtyczki.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
jQuery.fn.foo = function(options) {
  var defaults = {
    length: 300,
    index: 2,
    text: "more"
  };
  var options = $.extend(defaults, options);
  var txt = "length: " + options['length'] + "\n";
  txt += "index: " + options['index'] + "\n";
  txt += "text: " + options['text'] + "\n";
  txt += "other: " + options['other'];
  alert(txt);
};

Własne typy zamiast prymitywów

Często spotykam się z kodem źródłowym, w którym klasy służą tylko do opakowania wielu zmiennych w celu zwrócenia wyniku funkcji. Typy nie powinny być kubełkami wartości tylko odzwierciedleniem idei i zamysłów programisty. Jakiś czas temu nie łatwo było mi przekonać znajomego dlaczego stworzyłem osobny typ reprezentujący język aplikacji zamiast wykorzystania zmiennej typu znakowego.

1
2
3
class Language {
  private String languageCode;
}

Ostatnio jednak wpadłem na jeszcze lepszy przykład wprost z aplikacji, nad którą aktualnie pracujemy. Główna ideą aplikacji CMS jest zarządzanie stronami i sekcjami, w których strony są umieszczane. Każda strona posiada swój unikalny adres.

1
2
3
class Page {
  String getUrl() {}
}

Powiedzmy, że nie jest to takie tragiczne rozwiązanie ale tylko do momentu kiedy zechcemy dodawać i usuwać wersję językową do adresu. W takim wypadku musielibyśmy dodać dodatkowe metody do klasy strony.

1
2
3
4
5
class Page {
  String getUrl() {}
  String getUrlWithoutLangVersion() {}
  String getUrlWithLangVersion(UserSession session) {}
}

Co jednak jeżeli chcielibyśmy wykonać jaką operację na samym tylko adresie np. pobranie nazwy strony albo wersji językowej? Zawsze możemy zastosować klasy pomocnicze.

1
2
3
4
5
6
7
8
class Page {
  String getUrl() {}
}

class PageUrlHelpers {
  static String getUrlWithoutLangVersion(String url) {}
  static String getUrlWithLangVersion(String url, UserSession session) {}
}

O ile taka implementacja pozwoli nam osiągnąć zamierzony cel, o tyle nie ma ona prawie nic wspólnego z programowaniem zorientowanym obiektowo. Dobry rozwiązaniem byłoby stworzenie osobnego typu reprezentującego adres strony. Przeniesienie logiki operacji na adresie do osobnej klasy pozwala nam używać tego typu w klasie strony ale także niezależnie jeżeli potrzebujemy operować na samym tylko adresie.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
class PageUrl {
  PageUrl(String pageUrl) {}
  String toString() {}
  String getUrlWithoutLangVersion() {}
  String getUrlWithLangVersion(UserSession session) {}
}

class Page {
  PageUrl getUrl() {}
}

Co z tych rozważań wynika? Oczywiście nic nie stoi na przeszkodzie aby stosować styl proceduralny w języku zorientowanym obiektowo. Jednak tracimy wtedy wszystkie zalety naszego narzędzia, płynąć pod prąd wyrządzamy sobie sami szkodę. Problemy nie pojawią się na początku projektu kiedy złożoność jest niska. Dadzą się we znaki kiedy entropia odpowiednio wzrośnie. Dlatego trzeba złożoność systemu rozbijać na małe moduły, które wstydliwie ukrywają przed światem szczegóły ze swojej prywatności.

Domyślne kodowanie znaków JVM

Every instance of the Java virtual machine has a default character encoding. The default encoding is determined during virtual-machine startup and typically depends upon the locale and encoding being used by the underlying operating system.

irb i Windows

Okay, here’s what you do to get tab completion working in Windows. Download this. A zip with two files inside. These get copied into your Ruby installation. Place readline.dll in the bin folder. The readline.so goes in lib/ruby/1.8/i386-mswin32 folder.

Then, run in your command shell: irb –readline -r irb/completion.