2016. július 24., vasárnap

EMA and Plumbr - Memory leak hunting

Hogy ne mindig csak a dynaTrace-ről legyen szó, most az Eclipse Memory Analyzer-rel és a Plumbr eszközökkel mutatom meg, hogyan lehet megoldni egy memória szivárgást. Egy web-alkalmazásnál tapasztaltam azt a jelenséget, hogy néhány undeploy-deploy művelet hatására java.lang.OutOfMemoryError: PermGen space hiba keletkezett. A szokásostól eltérően, most nem a dynaTrace-t vettem elő (mert az adott szerveren nem volt DT licence) hanem más alternatívákat.

Az OutOfMemory hatására készült egy heap dump, amit betöltöttem az EMA eszközbe. Itt van egy jó tutorial az EMA-val való ClassLoading leak megtaláláshoz. A megoldáshoz nem kellett sokat keresgélni, mert már a beépített Leak Suspect Report is kimutatta, hogy hol lesz a probléma, mindenesetre azért kicsit magam is megnézegettem a dumpot, ahol bebizonyosodott, hogy az oracle jdbc driver miatt, az osztálybetöltő nem tudott felszabadulni.


Már rég kiakartam próbálni a java agnet alapú Plumbr free verzióját, ezért ez a memory leak pont kapóra jött nekem. A Plumbr nem az utólag elkészített heap dump-ot analizálja, hanem real-time figyeli az alkalmazásunkat és ha egy anomáliát talál, azonnal kijelzi a probléma okát és még megoldási javaslatokkal is ellát minket. Ezt már nevezem!


Itt, itt meg itt találtam néhány leírást ami pontosan illeszkedett erre a problémára, röviden tehát a leak-et az okozta, hogy az adatbázis driver nem került sohasem felszabadításra egy WildFly bug miatt, amit az osztálybetöltési policy módosításával sem sikerült orvosolni. Végül, más megoldás hiányában - egy nem szép - de működő programozott megoldást próbáltam ki amivel megoldódott a hibajelenség.


Jut eszembe, a Java 8-ban már nincs is perm gen space helyette van metaspace. :)

2016. július 15., péntek

Arduino Uno - Szenzor projekt

A Raspberry Pi mini számítógépem mellé vettem pár hónapja egy Arduino-t és néhány szenzort is az elektronikai kísérletezéshez. Az Aliexpressz-ről rendeltem meg a cuccokat, így kb. 4000Ft-ért kaptam egy Arduino UNO klónt USB kábellel, egy PIR mozgásérzékelőt, egy DHT-22 nagy pontosságú hőmérséklet és páraszenzort valamint egy HCR-SR04 ultrahangos távolságmérőt. A célom az volt, hogy a szenzorok által begyűjtött mérési eredmények a fejlesztő eszköz konzolján megjelenjenek.


Az alábbi programot készítettem el, majd feltöltöttem az Arduino-ra. A kódban definiáltam a szenzorok lábait, amelyekről a mérési eredmények beolvashatók, majd a Serial.print() hívással egyszerűen kiírattam ezeket a konzolra.
#include "DHT.h"

#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
 
int triggerPin = 11;    
int echoPin = 12;   
long durationMicroSec,cm;

int pir=4;

void setup() {
  Serial.begin (9600);
  
  //HCSR04
  pinMode(triggerPin, OUTPUT);
  pinMode(echoPin, INPUT);
  
  //DHT22
  dht.begin(); 
    
  //PIR
  pinMode(pir, INPUT); 
}
 
void loop()
{  
  //HCSR04
  digitalWrite(triggerPin, LOW);
  delayMicroseconds(5);
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPin, LOW);

  durationMicroSec = pulseIn(echoPin, HIGH);
  cm = (durationMicroSec*0.000001*34300)/2.0; //s=v*t

  Serial.print(cm);
  Serial.print("cm");
  Serial.println();
    
  //DHT22
  delay(2000);
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  Serial.print("Humidity: "); 
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: "); 
  Serial.print(t);
  Serial.print(" *C ");
  Serial.println();
  
  //PIR
  if(digitalRead(pir)){      
      Serial.print("There is motion");
  }
  else{
      Serial.print("There is no motion");
  }
  Serial.println();  
}
Az Ardunio használatával, pár ezer forintból akár egy komplex otthoni biztonsági rendszert is kialakíthatunk. Ha lecsupaszítjuk az Ardunino-t a felesleges elektronikai részektől, akkor egy akkumulátorról akár több hónapig is képes a működésre. A mért jellemzőket pl. rádió frekvenciás csatornán (szintén pár 100Ft-os áramkör) egy Raspberry Pi-nek is továbbíthatjuk, amivel feldolgozhatjuk és eltárolhatjuk a mért adatokat. A lehetőségeknek nem a pénztárcánk, hanem csak a képzeletünk szabhat határt! :)

2016. július 1., péntek

Raspberry PI - UFO keresés a szabad CPU időben

A Bionic program használatával a szabad CPU idődben valamilyen értelmes tudományos projektben vehetsz részt. Például űrlények vagy aszteroidák után kutathatsz :), pulzárok felfedezéséhez járulhatsz hozzá vagy különféle betegségek gyógyításában segíthetsz. Az elérhető projektekről itt van egy lista. Mivel van egy folyamatosan működő Raspberry Pi mini számítógépem, amit torrent kliensnek, web-szervernek valamint SSL Socks proxy-nak használok, a szabad CPU idejét ráállítottam az UFO kutatásra a Seti@Home projekttel, ami a rádióteleszkópok adatait tölti le majd elemzi ki az otthoni RPI-n.

Az UFO kutatás megkezdéséhez nincs más dolgunk, mint beregisztrálni magunkat a SETI@Home oldalára az alábbi linken és a Raspberry Pi-n feltelepíteni és bekonfigurálni a bionic ill. Seti programokat ezen leírás alapján az alábbi parancsokkal:

apt-get install boinc 
cd /var/lib/boinc-client
wget https://github.com/dcarrion87/boinc-rpi/raw/master/bin/setiathomev7-armv6l.tar.gz
tar xfz setiathomev7-armv6l.tar.gz
chown -R boinc:boinc projects/
Add "ENABLED = 1" to /etc/init.d/boinc-client if you want to run as a service.
boinccmd --lookup_account http://setiathome.berkeley.edu <your_email> <your_password>
boinccmd --project_attach http://setiathome.berkeley.edu <your_account_key>

Az aktuálisan futó taszkot a boinccmd --get_tasks paranccsal tudjuk lekérdezni, valamint a webes felületen is megtekinthetjük a szerzett kreditek számát.