Wednesday, October 8, 2008

Java performance: Strings

Here's a short report about different Strings concatenation methods I performed.

Strings joining is very often repeated operation.

String str1 = "Mary had ";
String str2 = "a little ";


String finalStr = str1 + str2 + " lamb";

Did you know that creating finalStr will cost you 3 String object creations? Maybe it's somehow optimized inside JVM but still takes very long time and resources. The solution is to use StringBuffer (synchronized) or StringBuilder (not synchronized). Difference between StringBuffer and StringBuilder is that StringBuffer is thread-safe which means that finalString could be assembled by few concurrent threads. But if you don't need multithreaded string concatenating (which is the most often case!) use StringBuilder.

Below is the time comparison of three concatenation methods. First I joined 10 strings (often case) and then I checked work time for 1000 strings which will point out sharply performace differences. (Time is given in microseconds)

10 strings

+ concatenation: 126us
StringBuffer: 23us
StringBuilder: 11us

1000 strings

+ concatenation: 11810us (11.81ms)
StringBuffer: 253us
StringBuilder: 123us

Conclusion:
Use StringBuilder!

Paralell port programming under Java (Windows XP)

There's been a lot of neat articles. So I won't repeat this topic again. There's very handy Communications API by sun. But while serial ports worked as a charm I had troubles with paralell port. I couldn't write any byte into LPT port. I've searched the net and I've found an important notice from Paul J. Perrone, a java programmer, which I will cite here because it can disappear in the future from cited forum.

"The OS and
driver software must cleary require that the status input lines be
broadcasting signals that indicate the external device is OK (...)


After some more tinkering, the trick was to tie the parallel port
status lines 10 & 11 (Ack and Busy) to low/ground and lines 12, 13, &
15 (paper out, select, & error) to high/5V. This should be done
through the output of a buffer chip though. I also tied lines 18-25 to
low/ground."


The point is that driver must be shure that there's a plenty of paper, "printer" is ready to go, there's no error... All these informations are provided by special status lines, mentioned above. So I did all the soldering. And provided external +5V for proper high states. And well... it didn't work... :) Maybe it will for you.

So I dug and finally I've found a solution for Windows XP. Sorry, this time not for Linux. The problem is that port connection is hardware and OS dependent, so every library must have some kind of JNI library with proper DLL or other native lib.

Library that worked for me can be obtained at http://www.hytherion.com/beattidp/comput/pport.htm I must confess that all the soldering from citation above left in my LPT connector. I'm sure that's not necessary to put some "config" bits on all these state inputs.

Best regards, and enjoy parallel port programming!

Tuesday, October 7, 2008

Alternatywne pole twórcze Developera - kuchnia!

Z cyklu Developer masochista wyżywa się nie tylko na klawiaturze, proponujemy dzisiaj Państwu pizzcę.

public class Pizza extends Food implements EasyStuff, QuickJob {

//TODO pizza!

}

Uwaga. Tricki są wykonywane przez doświadczonych kaskaderów-amatorów, którzy przeżyli już niejedno złamanie. Nie próbujcie tego w domu! Lepiej idźcie do Picy Hut albo MacDynalda i najedzcie się do syfa... syta. :)

Ciasto
Naszym sekretem jest ciasto... sie reklamuje jedna z sieci picerskich, a przecież wszystko kręci się wokół mąki, wody, drożdży i soli?! No, oczywiście trzeba jeszcze wiedzieć jakie są proporcje, jaka ma być temperatura drożdży w trakcie rozkwitu, w jakiej kwadrze księżyca solić, ile dziewic musi przy tym śpiewać pieśni wojenne oraz ile czasu zagniatać pośladkami ciasto...

Dobra, moje ciasto nie jest idealne, ale w sumie badziewie to to też nie jest i da się zszamać ze zmakiem.
Potrzebujemy 3 szklanki mąki, 2/3 szklanki ciepłej wody, 30g drożdży, sól, olej. W 1/3 szklanki wody rozpuszczamy drożdże i wstawiamy do ciepłego miejsca na 15 min. Ja włączam na chwilę piekarnik żeby złapał trochę ciepła.
Mąkę warto przesiać sitkiem (np. takim do herbaty), bo często są w niej syfy. Szczególnie jeśli jest to low-endowa mąka (jedynka, euroshopper itp. tani produkt). Ostatnio używałem takiej. Już wiem dlaczego dało się obniżyć koszty produkcji. Mieląc ją z tym z czym przyjechała. W sitku zostało mnóstwo drobnych kamyków....
Kiedy drożdże się spączkują mieszamy je z resztą wody, mąki i łyżką soli. Zagniatamy. Pośladkami nie warto, bo potem zostają włosy w cieście...

Ugniatamy, ugniatamy, ugniatamy... Kiedy poczujesz, że warto dodać wody, dodaj i tak samo z mąką. Ciasto nie może lepić się do rąk. Na końcu dodaj ok 1 łyżki stołowej oleju.

Sos
Nie mam specjalnego sosu. Możliwości jest kilka. Bardzo klasyczny sos robi się z pomidorów świeżych lub z puszki. Jednak te trzeba by dusić w nieskończoność.
Proponuje przecier pomidorowy, przyprawy (oregano, bazylia), łyżka kwaśnej śmietany oraz opcjonalnie drobno posiekany czosnek*. Ostatnio dodaję również ok. łyżki oleju, sos się wtedy mniej wysusza podczas pieczenia.
*Do czosnku jest zawsze komentarz: przed obraniem należy go lekko rozgnieść. Musi pęknąć. Według jakiejś kosmicznej sztuki tai-chi, kung-fu i feng-shui wtedy dzieje się coś pozytywnego i jest lepszy (?!). Być może to kwestia jakichś olejków, które się uwalniają albo może to kwestia złamania silnej woli czosnku, żeby dał się pokroić żywcem. Nie wiem, ale zawsze go gniotę ;)

Dodatki
Czyli to co stanowi o tożsamości pizzy oraz podnosi jej wartość, bo... ! jest cholernie droga w każdej picerni! Ale my mamy na to remedium. Sami se upieczemy wymarzoną pizzę.
Każdy kto jada pizzę wie co można na nią wrzucić, więc nie ma sensu dywagować na ten temat. Warto tylko pamiętać, aby nie pomieszać za dużo smaków ze sobą i że niektóre rzeczy trochie do siebie nie pasują.
Na końcu klasycznie posypujemy żółtym serkiem marki dowolnej. Ser może być w plastrach lub starty. Mam taką fajną książkę z Gazety Wybiórczej, o pizzach, i powiem Wam, że pizze z serem to 1/3 propozycji. Większość sera nie ma, ale komercyjne oblicze pizzy zawsze obcieka serem. Tu dodam, że ciekawą propozycją może być ser pleśniowy. Smakuje naprawdę nieźle. Czasem używam go pod naciskiem mojej żony, smackoschki serów pleśniowych*.
*Tu kolejna gwiazdka, jak przy promocji kredytu 0% czy innego gówna. Tak jak śledzik lubi wódeczkę, tak serek pleśniowy wprost kocha (pół-)wytrawne winko. Polecam bardzo, bardzo.

Pieczemy
Ja mam cholerny piekarnik gazowy. Szybko się nagrzewa, ale pali tylko od dołu i potrafi przypalić ciasto, a na górze jeszcze surowe. W każdem razie potrzebujecie jakiegoś piekarnika. Nie, nie, mikrofala odpada. Pieczemy 20-25 min. Byle nie za długo, bo dodatki się zeschną, a ciasto, o ile cienkie, przyjara.

Podsuma
Nie bój się eksperymentować. To najprzyjemniejsze. Moje żarcie nigdy nie smakuje... (ekhm...) tak samo, bo zawsze coś kombinuje. To mnie rajcuje. Moje pizze czasem są swego rodzaju katharsis, ale nie dla człowieka tylko dla lodówki :D Wrzucam co się rusza i fajnie to smakuje. Wiecie jaka ciekawa jest pizza ze starą kieł... yyyy, w każdem razie można uzyskać niespotykane efekty. Do tego możecie powiedzieć, że umiecie gotować ;) a to już dobry materiał na męża/żonę.

Smacznego! ;)

Installing Debian on Neo1973

I'm just installing Debian on Neo1973 phone and I found some hard points to solve. So I decided to do some notes how to do it. It could be useful for others.

Installing HowTo is under http://wiki.debian.org/DebianOnNeo1973 . According to it, we should run

./installDebianOnNeo.sh all

but suddenly, due to a bug in debian security package, it fails with an error

Can't find keyring debian-archive-keyring.gpg

After minutes of digging I found solution. A debian stage calls cdebootstrap-static and it can take missing pgp file as an argument, so you need to download it from the net (or suck from own PC's debian installation), I found it on

http://www.inf.ufpr.br/vioga05/var/usr/share/keyrings/debian-archive-keyring.gpg

Put this file to /tmp dir and modify line of cdebootstrap-static call

cdebootstrap-static --allow-unauthenticated --flavour minimal --keyring=/tmp/debian-archive-keyring.gpg --include=$CDEBOOTS...

I assume that you did ./installDebianOnNeo.sh all before. Now run

./installDebianOnNeo.sh debian

The installation will go further but fails again with unmet dependecies of libcaca0 and libcucul0. Due to fact that apt is set to unstable distribution there are some dependecies probles. Solution is to switch to testing, then install libcaca0 and libcucul0 and then switch back to unstable. To do this, switch to prepared debian root on SD card with

chroot /mnt/debian /bin/sh

then edit /etc/apt/sources.list and change first entry from ustable to testing. Then refresh packages list with

apt-get update

install missing libraries

apt-get install libcaca0 libcucul0

Exit chroot (with exit command :) ) and go with the remaining stages

./installDebianOnNeo.sh apt fso configuration kernel unmount

After that, follow the rest of main debian on Neo1973 manual.

Voila! Enjoy Debian on Neo1973 :D