środa, czerwca 27, 2012

Java 8 nadchodzi....

Ostatnio na HackerNews natrafiłem na linkę do opisu paru nowych rzeczy z Java 8.
Postanowiłem się im przyjrzeć i mam mieszane uczucia ;-)

Lambdy nie są do końca tym czego się spodziewałem. Zakładałem, że będą bardzo podobne do tego co jest w JavaScript.... aż tak dobrze jednak nie będzie ;-)
Nie przypiszemy sobie (albo ja nie umiem) ciała metody do zmiennej i nie wywołamy później, o np. tak:
Mathod doSth = () -> { System.out.println("Toster"); };
doSth();
Taki numer przejdzie tylko jeśli naszą lambodwą metodę przypiszemy do jakiegoś interfejsu funkcjonalnego (takiego z 1 metodą tylko, np. do Runnable).
Runnable r = () -> { System.out.println("Toster"); };
r.run();

To zadziała.
Ciekawe jest to, że w ciele takiego lambodwej metody możemy używać wartości zmiennych (z zewnątrz), które są efektywnie finalne ;-)
Z klasami anonimowymi było tak:
final int i = 7; // i musi być finalne by móc go użyć dalej
new Thread(new Runnable() {
   public void run() {
       System.out.println(i);
   }
}).run();
Teraz może być tak:
int i = 7;
new Thread(() -> { System.out.println(i); }).start();

pod warunkiem jednak, że i nigdzie dalej nie ulegnie zmianie ;-) nie może też ulec tej zmianie wcześniej ;-)

Faktem jest jednak, że taki kod jest krótszy i chyba jednak bardziej czytelny.

Lambdów można używać też kolekcjami i to jest naprawdę miłe.
Kiedyś (znaczy teraz też, od 2013 roku już nie będzie trzeba ;-)) by z listy wybrać tylko parzyste liczby trzeba było walnąć kod:
List<Integer> list = Arrays.asList(75,22,3,55,22,11,7,35);
List<Integer> result = new ArrayList<Integer>();
for (int num:list) {
  if (num%2==0) result.add(num);
}

Teraz wystarczy:
List<Integer> list = Arrays.asList(75,22,3,55,22,11,7,35);
List<Integer> result = list.filter(e -> e%2==0).into(new ArrayList<Integer>());
A właściwie nawet tylko:
List<Integer> list = Arrays.asList(75,22,3,55,22,11,7,35).filter(e -> e%2==0).into(new ArrayList<Integer>());


Co trzeba przyznać wygląda na krótsze ;-) i chyba czytelniejsze.

W Java 8 ma pojawić się też możliwość definiowania domyślnej implementacji kodu dla interfejsów....
W swoim życiu spotkałem się chyba z 1 sytuacją gdy to byłoby potrzebne, bez tego musieliśmy mieć w interfejsie klasę Adaptera do tego i jej używaliśmy tam gdzie to implementowaliśmy......
To taka furtka do wielodziedziczenia jest.
Wygląda to tak:
public interface I1 {
   void doSth() default {
        System.out.println("from I1");
   }
}
I od teraz jeżeli zrobimy klasę, która to implementuje, ale nie napiszemy naszej implementacji to w naszej klasie pojawi się automagicznie metoda o implementacji domyślnej...
Jeśli napiszemy własną to tamta zniknie (można się do niej dostać chyba przez I1.super()).

Zabawniej się robi jak są 2 interfejsy z tą samą metodą i domyślnymi implementacjami :-)
public interface I1 {
   void doSth() default {
        System.out.println("from I1");
   }
}

public interface I2 {
   void doSth() default {
        System.out.println("from I2");
   }
}

public class Test implements I1, I2 {
}
Taki kod się nie skompiluje.... ale jeśli Test zmienimy na:
public class Test implements I1, I2 {
   public void doSth() {
      System.out.println("from Test");
   }
}
To już się skompiluje ;-)

Ogólnie przydatne mogą być lambdy w operacjach na kolekcjach. Do składni się trzeba przyzwyczaić, ale później pozwalają dużo czasu na pisaniu zaoszczędzić.... inna sprawa, że nie jestem pewien jak później się przekładają na maintanance ;-)

Ogólnie mam mieszane uczucia, ale bardzo możliwe, że przemawia przeze mnie konserwatyzm ;-)


Podobne postybeta
Ile to jest 1+1 w Java'ie?
Który kod (nie kot! ;-)) lepszy?
Sztuczki tropiciela błędów, part 4
Nie lubię Sparka ;-)
Sztuczki tropiciela błędów, part 3 - hackujemy klasy finalne ;-)

piątek, czerwca 01, 2012

Maszyna stanów kontra labirynt ;-)

OK, wiem że to co tu napiszę nie zawsze działa ;-) [przed chwilą stworzyłem labirynt w którym moja maszyna stanów nie podołała ;-) ale już jest za późna pora by szukać błędu...]

Zobaczyłem dziś na HackerNews linkę do Google Blockly, a tam jeden z przykładów [do napisania ;-)] to rozwiązywanie labiryntu.
Chwilę się tym pobawiłem, ale mi ELSE brakowało w IF, więc sięgnąłem po kawałek papieru (tym razem koperta z banku) i narysowałem sobie maszynę stanów, która jak mi się wydaje powinna rozwiązywać labirynt przez poruszanie się po nim z lewą ręką na ścianie..

Później to zakodowałem w Pythonie i tak wygląda program w działaniu ;-)


Najważniejszy kawałek kodu wygląda tak:

while (startX!=endX) or (startY!=endY):
if state==0:
newDir = turnLeft(dir)
if empty(startX+newDir[0],startY+newDir[1]):
state=1
else:
state=2
continue
if state==1:
dir = turnLeft(dir)
startX+=dir[0]
startY+=dir[1]
state = 0
continue
if state==2:
if empty(startX+dir[0],startY+dir[1]):
state=3
else:
state=4
continue
if state==3:
startX+=dir[0]
startY+=dir[1]
state=0
continue
if state==4:
dir = turnLeft(dir)
state=0
continue

Na wejściu mamy w (startX,startY) pozycję startową, a w (endX,endY) pozycję końcową.
turnLeft() po prostu obraca "wektor" dir w lewo o 90 stopni, a empty() sprawdza czy pole przed nami jest puste, czy nie :-)
state to akutalny stan maszyny, można to zrobić ładniej, ale chciałem by było to widać.

Jak ktoś ciekawy to tutaj pliki do pobrania:
maze.py - program w Pythonie (jeśli chcesz go uruchomić na Linuksie czy innym *niksie to zmień os.system("cls") w os.system("clear"), nie chciało mi się kombinować to użyłem tak ohydnej metody czyszczenia ekranu :-))
maze.txt - labirynt
maze2.txt - labirynt zabójca dla programu ;-) zaczyna się kręcić "jak smród po gaciach" ;-)

I moje 30 minut kodowania (prywatnego) odbębnione :-)


Podobne postybeta
Hmm... znów się bawię ChatGPT i rysujemy obrazek ;-) a później piszemy kod z obrazka ;-)
Nigdy nie zapominaj o FSM! ;-)
Śmierdząca ryba wolności ;-)
Windows mnie jednak nie lubi ;-)
Python zabójca ;-) czyli krótka opowieść o tym jak multiprocess "zabił" komputer ;-)

piątek, maja 25, 2012

Paradoks samochodowy ;-)


Ludzie kupują droższe/lepsze samochody niż ich stać by być szczęśliwszymi z ich posiadania.
Jak je już mają to są ciągle nieszczęśliwi bo "te chamy źle jeżdżą", "paliwo za drogie", "znów się popsuł" albo "ktoś zarysował".

Może ja mam coś z oczami, albo wnioskowaniem, ale ja tu widzę pewną sprzeczność ;-)


[Go to original post on Google+]




Podobne postybeta
"Arystokraci" od siedmiu boleści
Różnica między Seniorem i Juniorem ;-)
Atom
Paradoks autostradowy ;-)
Cena benzyny w górę, wydatki na paliwo w dół ;-)

niedziela, maja 20, 2012

I jak "po bożemu" zrobić updatowanie widoku na podstawie danych z sieci w Androidzie?

Już trochę kodu dla Androida napisałem, ale nadal jest jedna rzecz której nie wiem.
Tzn. wiem jak to coś zrobić na wiele sposobów, ale nie wiem nadal jak to się powinno robić "po bożemu", albo zgodnie z księgą....

O co chodzi?

O banał.
Mamy aktywność, która np. wyświetla kurs akcji i chcemy co jakiś czas to zupdatować...

Zrobić to można na wiele sposobów.

Pierwszy, prosty z pozoru, choć bardzo zły i nieandroidowy to stworzyć sobie wątek, który pogada z siecią po czym wyświetlić.
Zaleta jest taka, że jest prosto, wad jest sporo.
Najistotniejsza taka, że jak nam ktoś w momencie gdy pytamy sieć zmieni orientację ekranu to aktywność zginie śmiercią tragiczną, a wątek zostanie i się dopiero wykrzaczy jak będzie próbował zrobić update na UI. Do tego odpowiednio kręcąc urządzeniem możemy sprawić, że będzie ono non-stop atakować serwery i prosić o dane, serwery będą ciągle to przysyłały, a user i tak nie zobaczy ;-)

Można też powołać do życia serwis, zarejestrować BroadcastReceiver, odpalić serwis i czekać. Serwis się z siecią połączy, pobierze dane, podeśle je do aktywności przez broadcast... oczywiście problem będzie znów jak ktoś nam zmieni orientację bo zarejestrowany BroadcastReceiver jest połączony z tą aktywnością która zginie.... Można by niby tutaj (i w poprzednim podejściu) dodać callbacka, a sam BroadcastReceiver zrobić statyczny.... ale też to takie sobie jest.

Można bawić się z serwisem i bindowaniem tego serwisu z aktywnością......

Można bawić się z ContentProviderem.

Można coś robić na poziomie aplikacji (taki singleton, który nam oferuje środowisko).....

I tylko problem jest taki, że nie wiem jak autorzy Androida chcieli by to załatwiać...

Ktoś wie? ;-)

Podobne postybeta
Google Play Services dobre jest :-)
Androidowe boje... ale nie takie morskie ;-)
O tym w czym iOS jest lepszy od Androida
Wszyscy hackują Androida ;-)
Bloggeroid 1.2 - zróbmy to ciut bardziej przewidywalne ;-)

Nie kijem go to pałką ;-) czyli resumable upload do Google Docs z Androida i jak uniknąć 411 Length Required :-)

W skrócie jest tak.
W API 3.0 do Google Docs pliki wysyła się (czy to po raz pierwszy, czy po to by je zupdatować) w kawałkach.
Najpierw pod specjalny adres wysyła się info o pliku, serwer zwraca lokalizację gdzie trzeba wszystko wysyłać.

Taka jest teoria. I w większości miejsc się sprawdza ;-)

Ale nie w Androidzie. Tutaj po wysłaniu PUT do pierwszego adresu zamiast lokalizacji przychodzi błąd 411 Length Required.

Czemu?

Bo w niektórych wersjach Androida był błąd powodujący, że ustawienie Content-Length na 0 sprawiało, że ten nagłówek nie był ustawiany...... [co najlepsze czasami].
Walczyłem, szukałem po sieci i nic.
Na PC działa, na Androidzie 1.6 nie działa. Na 2.2 działa......

I w końcu znalazłem rozwiązanie ;-)
Skoro Content-Length nie jest dodawane gdy jest równe 0 to może by ustawić je na 1 i wysłać w tym pierwszym requeście dokładnie 1 bajt? :-)
Spróbowałem i działa :-)

Podobne postybeta
Naprawdę uwielbiam...
Ha! Ochidna Echidna potrafi updatować pliki :-)
iCloud jest podły....
Tam gdzieś jest foka...
Programowanie jest stresujące

czwartek, maja 17, 2012

Maniacki pomysł na inteligentny dialer ;-)

Przypomniało mi się gdy pisałem poprzedniego posta.
Tak czytając Machine Learning in Action szukałem sobie miejsc gdzie by można było tego użyć w mobile i wyszło mi że można by było spróbować zrobić do telefonu dialer, który by się uczył.
Normalnie w takim Androidzie dialer podaje listę ostatnio wykonanych połączeń.
A co gdyby nad tą listą był jeden, może dwa item ze "zgadniętymi" numerami, które w oparciu o czas, a może i lokalizację wydają się być w danym momencie najbardziej prawdopodobnymi numerami?
Oczywiście widzę wady takiego pomysłu ;-) np. po zerwaniu telefon dość długo by proponował dzwonienie do byłej dziewczyny ;-)

Jeden problem w przetestowaniu tej idei jaki teraz mam to to, że na razie znam z uczenia maszynowego tylko algorytmy, które musiałyby dostawać odpowiednio spreparowane dane, a tego wolałbym uniknąć i wolałbym by bazowały tylko na gołych danych i same starały się je zrozumieć... ale możliwe, że AdaBoost użyta na kNN i naiwnym klasyfikatorze bayesowskim by dała radę? Nie wiem, będę to musiał przetestować.... co znaczy, że muszę dopisać kolejną rzecz do tego nad czym mam pracować ;-)


Podobne postybeta
Dwie książki komputerowe na długi weekend :-)
Przymiarki do nowego Bloggeroida
Zwłoki na plakatach... brrr...
Informacja źródłowa
Śmierdząca ryba wolności ;-)

Geolokalizacja ma problemy

Stwierdzam, że wszystkie twory w stylu Foursquare, czy meldowanie się w Google Maps to ściema i strasznie niewygodna rzecz.
Lekko licząc trzeba na to zmarnować z 30 sekund, z których większość spędzimy na czekaniu na lokalizację lub operacje sieciowe.
Po tym czasie zaś jedyną nagrodą jest to, że jesteśmy gdzieś zameldowani....
Próbowałem przez miesiąc czy coś koło tego i stwierdzam, że to nie jest dobra droga. Za długo trwa, a za mało daje by marnować na to czas.
Gdyby np. można było by dostać za logowanie zniżkę to może by się chciało. Bez tego jedynym rodzajem zachęty jest nuda po wejściu do danego miejsca, lub chęć pokazania się.
Mnie najwięcej radości meldowanie dało jak w Dallas siedziałem w restauracji i jakoś nie było tematów do rozmów z innymi osobami przy stole...
Żeby draństwo przyspieszyć trzeba by pokombinować z częstrzym ustalaniem położenia (co będzie źreć baterię..) albo z cacheowaniem miejsc w oparciu o zgrubną lokalizację.
Może jeszcze np. coś bazującego na uczeniu maszynowym? Większość ludzi jednak żyje wg. pewnego schematu i zapewne w środę koło godziny 18 będą w tym samym miejscu w którym byli przez większość śród o tej porze ;-)

posted from Bloggeroid


Podobne postybeta
Komputer bez sieci nie ma już sensu
Marcowe książki
Ostatnie wolne wybory już były?
Pomodoro z positive reinforcement? ;-)
Śledzimy geolokalizację ;-)

wtorek, maja 15, 2012

Malutki serwerek HTTP - dziełko, albo potworek ;-)

Zapragnąłem posiadać malutki serwerek HTTP/WWW, który działałby mi w trayu Windowsa i w razie konieczności mógłbym go włączyć klikiem.
No to sobie takowy skleciłem :-)

Nie prezentuje się okazale:


Ale za to zżera na starcie "tylko" 30 MB co i tak sprawia, że prawie go nie widać ;-) [sam plik wykonywalny ma około 12 KB ;-)]
Protokół HTTP tak sobie interpretuje. Działa w nim tylko GET, ale jak zauważyłem do większości rzeczy działa całkiem znośnie. Nawet można nim serwować strony ;-) [choć to najmniej lekkie szaleństwo]. Ale np. jak serwuję strony z Windows do Ubuntu w VMware Player to tak sobie to działa ;-)

Plusem tego, że to jest Java powinno być działanie serwerka tak na Windows jak i na Linuksie a pewnie i Mac OS X, albo Solarisie ;-)

Jeśli ktoś chciałby się pobawić to tutaj jest pliczek wykonywalny. A nóż wam zadziała? :-)

Update: jakby to kogo interesowało to serwerek uruchamia się na porcie 8000.


Podobne postybeta
Lepsze jest wrogiem dobrego
Nowy potworek na tapecie ;-)
Giń konstruktorze! Giń! ;-)
Uspokajacz
Electron + Airly = wskaźnik jakości powietrza w pasku ;-) - part 2, źródła ;-)

piątek, maja 11, 2012

Mobile jest głupi..... przynajmniej w pracy/ważnych sprawach ;-)

Macie ważną sprawę do kogoś.
Piszecie maila. Po kwadransie otrzymujecie odpowiedź z jakiegoś urządzenia mobilnego......
Niby wszystko super.... ale....
Jeśli pytacie o jakieś dane to w najlepszym przypadku dostaniecie info "jak dotrę do komputera to przyślę", jeśli pytacie o coś co ustalono jakiś czas temu w innym mailu to w najlepszym przypadku dostaniecie tekst "jak dotrę do komputera to przejrzę pocztę". Zwykle jednak dostaniecie odpowiedź, która nie ma żadnej wartości bo autor nie ma jak dokładnie odpisać i nie ma na czym oprzeć swojej odpowiedzi.

Teraz spójrzcie na to z drugiej strony.
W telefonie macie włączoną synchronizację maila. Przychodzi mail, to klikacie by go przeczytać. Na szybko go skanujecie (przecież w koło są ważniejsze rzeczy do zrobienia) i jeśli to coś ważnego to odpisujecie, a zwykle stwierdzacie coś w stylu "jak będę przy komputerze to odpowiem"... i pewnie dość szybko zapominacie o tym mailu, a później zapominacie nań odpowiedzieć.

Tak sobie więc myślę, może warto wyłączyć synchronizację maila z telefonem i tabletem? Przecież to tylko powoduje, że w ciągu ostatnich 2 lat nie odpowiedziałem na całą masę maili bo o nich po prostu zapomniałem ;-)

Ktoś już wyłączył? ;-)


[Go to original post on Google+]




Podobne postybeta
Nimbus vs. Ocean - nowy Look And Feel w Swing
Człowiek to dziwne zwierze....
"We skrócie"
"i ma Office'a...."
Dołożę się do budżetu Rybnika ;-)

środa, maja 02, 2012

Dwie książki komputerowe na długi weekend :-)

Na długi weekend polecam 2 książki ;-)

Pierwsza to "Machine Learning in Action" (a tu w Amazon.co.uk). Dawno nie czytałem tak wciągającej książki "komputerowej", zwykle po paru stronach jest nudno, a tutaj jestem w 5 rozdziale i nadal jest ciekawo :-)
Wiem też już jak robi się drzewa decyzyjne przy pomocy algorytmu ID3 (użycie entropii jest po prostu genialne :-)), jak użyć naiwnego klasyfikatora Bayesa, albo jak użyć algorytmu kNN. Szczerze to dwa ostatnie znałem choć z tym Bayesem miałem zawsze pewne problemy.
Do wszystkiego są przykłady w Pythonie, co jest wg. mnie jednym z powodów dla których książka tak wciąga :-) człowiek musi wkładać ręce w "bebechy" i widzi efekty.

Druga książka to "Professional Android 4 Application Development" o jak łatwo się domyśleć pisaniu dla Androida.
Tutaj trudno mi wytłumaczyć co mi się podoba, chyba głównie to, że całą sprawę zaczynają przedstawiać od dobrej strony. Może to przez to, że już wiem jak coś trzeba robić? Ale zamiast tysięcy linii nieczytelnych listingów jest ich mniej, ale jakby dokładniejszych. Najtrudniejsza dla mnie część Androida czyli zrozumienie LayoutManagerów nie ogranicza się do 1 czy 2 stron ale do 5-10 ;-) różnica może nie duża, ale znacząca.
Wg. teorii znajdziemy tu to samo co w dokumentacji do Androida, ale prowadzone z jakąś myślą przewodnią.
Mnie się podoba :-)


Podobne postybeta
Maniacki pomysł na inteligentny dialer ;-)
ClickbaitDetector - to działa :-)
Odyseja Czasu - Burza Słoneczna
Logistic Regression wykrywa clickbaity lepiej od Bayesa ;-)
The Shepherd's Crown